Python Pandas - 忽略列名的不同列的 Concat 数据帧
Python Pandas - Concat dataframes with different columns ignoring column names
我有两个 pandas.DataFrames
我想合二为一。数据框具有相同数量的列,顺序相同,但具有不同语言的列标题。我怎样才能有效地组合这些数据帧?
df_ger
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4
df_uk
index Date No1 No2
0 1-1-17 5 6
1 2-1-17 7 8
desired output
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4
2 1-1-17 5 6
3 2-1-17 7 8
到目前为止,我想到的唯一方法是重命名列标题,然后使用 pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
。但是,我希望找到更通用的方法。
如果列总是以相同的顺序排列,您可以机械地rename
the columns and the do an append
像:
代码:
new_cols = {x: y for x, y in zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))
测试代码:
df_ger = pd.read_fwf(StringIO(
u"""
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4"""),
header=1).set_index('index')
df_uk = pd.read_fwf(StringIO(
u"""
index Date No1 No2
0 1-1-17 5 6
1 2-1-17 7 8"""),
header=1).set_index('index')
print(df_uk)
print(df_ger)
new_cols = {x: y for x, y in zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))
print(df_out)
结果:
Date No1 No2
index
0 1-1-17 5 6
1 2-1-17 7 8
Datum Zahl1 Zahl2
index
0 1-1-17 1 2
1 2-1-17 3 4
Datum Zahl1 Zahl2
index
0 1-1-17 1 2
1 2-1-17 3 4
0 1-1-17 5 6
1 2-1-17 7 8
如果你能确定两个数据帧的结构保持不变,我看到两个选项:
保留所选默认语言的数据框列名称(我假设 en_GB)并将它们复制过来:
df_ger.columns = df_uk.columns
df_combined = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
无论列名是什么,这都有效。但是,从技术上讲,它仍然在重命名。
使用 numpy.ndarrays 将数据从数据帧中拉出,在 numpy 中将它们连接起来,然后再次从中创建数据帧:
np_ger_data = df_ger.as_matrix()
np_uk_data = df_uk.as_matrix()
np_combined_data = numpy.concatenate([np_ger_data, np_uk_data], axis=0)
df_combined = pd.DataFrame(np_combined_data, columns=["Date", "No1", "No2"])
此解决方案需要更多资源,因此我会选择第一个。
我不确定这是否会比您想象的更简单,但如果主要目标是针对一般情况,那么只要有一个假设就可以了:两个文件中的列匹配,例如,如果日期是第一列,翻译后的版本也是第一列。
# number of columns
n_columns = len(df_ger.columns)
# save final columns names
columns = df_uk.columns
# rename both columns to numbers
df_ger.columns = range(n_columns)
df_uk.columns = range(n_columns)
# concat columns
df_out = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
# rename columns in new dataframe
df_out.columns = columns
您可以concat
数据帧值:
df = pd.DataFrame(np.vstack([df1.values, df2.values]), columns=df1.columns)
# or
df = pd.DataFrame(np.concatenate([df1.values, df2.values], axis=0), columns=df1.columns)
print(df)
index Datum Zahl1 Zahl2
0 0 1-1-17 1 2
1 1 2-1-17 3 4
2 0 1-1-17 5 6
3 1 2-1-17 7 8
如果要重新索引索引列
df['index'] = range(len(df))
print(df)
index Datum Zahl1 Zahl2
0 0 1-1-17 1 2
1 1 2-1-17 3 4
2 2 1-1-17 5 6
3 3 2-1-17 7 8
我有两个 pandas.DataFrames
我想合二为一。数据框具有相同数量的列,顺序相同,但具有不同语言的列标题。我怎样才能有效地组合这些数据帧?
df_ger
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4
df_uk
index Date No1 No2
0 1-1-17 5 6
1 2-1-17 7 8
desired output
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4
2 1-1-17 5 6
3 2-1-17 7 8
到目前为止,我想到的唯一方法是重命名列标题,然后使用 pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
。但是,我希望找到更通用的方法。
如果列总是以相同的顺序排列,您可以机械地rename
the columns and the do an append
像:
代码:
new_cols = {x: y for x, y in zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))
测试代码:
df_ger = pd.read_fwf(StringIO(
u"""
index Datum Zahl1 Zahl2
0 1-1-17 1 2
1 2-1-17 3 4"""),
header=1).set_index('index')
df_uk = pd.read_fwf(StringIO(
u"""
index Date No1 No2
0 1-1-17 5 6
1 2-1-17 7 8"""),
header=1).set_index('index')
print(df_uk)
print(df_ger)
new_cols = {x: y for x, y in zip(df_uk.columns, df_ger.columns)}
df_out = df_ger.append(df_uk.rename(columns=new_cols))
print(df_out)
结果:
Date No1 No2
index
0 1-1-17 5 6
1 2-1-17 7 8
Datum Zahl1 Zahl2
index
0 1-1-17 1 2
1 2-1-17 3 4
Datum Zahl1 Zahl2
index
0 1-1-17 1 2
1 2-1-17 3 4
0 1-1-17 5 6
1 2-1-17 7 8
如果你能确定两个数据帧的结构保持不变,我看到两个选项:
保留所选默认语言的数据框列名称(我假设 en_GB)并将它们复制过来:
df_ger.columns = df_uk.columns df_combined = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
无论列名是什么,这都有效。但是,从技术上讲,它仍然在重命名。
使用 numpy.ndarrays 将数据从数据帧中拉出,在 numpy 中将它们连接起来,然后再次从中创建数据帧:
np_ger_data = df_ger.as_matrix() np_uk_data = df_uk.as_matrix() np_combined_data = numpy.concatenate([np_ger_data, np_uk_data], axis=0) df_combined = pd.DataFrame(np_combined_data, columns=["Date", "No1", "No2"])
此解决方案需要更多资源,因此我会选择第一个。
我不确定这是否会比您想象的更简单,但如果主要目标是针对一般情况,那么只要有一个假设就可以了:两个文件中的列匹配,例如,如果日期是第一列,翻译后的版本也是第一列。
# number of columns
n_columns = len(df_ger.columns)
# save final columns names
columns = df_uk.columns
# rename both columns to numbers
df_ger.columns = range(n_columns)
df_uk.columns = range(n_columns)
# concat columns
df_out = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
# rename columns in new dataframe
df_out.columns = columns
您可以concat
数据帧值:
df = pd.DataFrame(np.vstack([df1.values, df2.values]), columns=df1.columns)
# or
df = pd.DataFrame(np.concatenate([df1.values, df2.values], axis=0), columns=df1.columns)
print(df)
index Datum Zahl1 Zahl2
0 0 1-1-17 1 2
1 1 2-1-17 3 4
2 0 1-1-17 5 6
3 1 2-1-17 7 8
如果要重新索引索引列
df['index'] = range(len(df))
print(df)
index Datum Zahl1 Zahl2
0 0 1-1-17 1 2
1 1 2-1-17 3 4
2 2 1-1-17 5 6
3 3 2-1-17 7 8