Python Pandas - 具有不同列的Concat数据帧忽略列名称

Axe*_*xel 13 python concat dataframe pandas

我有两个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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我想出的唯一方法是重命名列标题,然后使用pd.concat([df_ger, df_uk], axis=0, ignore_index=True).但是,我希望找到一种更通用的方法.

Ste*_*uch 8

如果列始终处于相同的顺序,则可以rename对列进行机械处理,并执行以下操作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))
Run Code Online (Sandbox Code Playgroud)

测试代码:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

         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
Run Code Online (Sandbox Code Playgroud)


Ynj*_*jmh 8

您可以使用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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

如果要重新索引索引列

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您可以确定两个数据帧的结构保持不变,我会看到两个选项:

  1. 保留所选默认语言的数据框列名称(我假设为 en_GB),然后将它们复制过来:

    df_ger.columns = df_uk.columns
    df_combined = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
    
    Run Code Online (Sandbox Code Playgroud)

    无论列名是什么,这都有效。但是,从技术上讲,它仍在重命名。

  2. 使用 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"])
    
    Run Code Online (Sandbox Code Playgroud)

    这个解决方案需要更多的资源,所以我会选择第一个。


小智 5

我不确定这是否会比您想象的更简单,但如果主要目标是一般性的东西,那么这应该可以满足一个假设:两个文件中的列匹配,例如如果日期是第一列,翻译版本也将是第一栏。

# 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
Run Code Online (Sandbox Code Playgroud)