web-dev-qa-db-ja.com

Python Pandas-列名を無視して異なる列を持つデータフレームを連結する

2つの _pandas.DataFrames_ を1つにまとめたいと思います。データフレームは同じ順序で同じ数の列を持ちますが、異なる言語の列見出しがあります。これらのデータフレームを効率的に結合するにはどうすればよいですか?

_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)を使用することです。しかし、より一般的なアプローチを見つけたいと思っています。

13
Axel

列が常に同じ順序である場合、機械的に 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))

テストコード:

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
8
Stephen Rauch

2つのデータフレームの構造が同じであることを確認できる場合、2つのオプションが表示されます。

  1. 選択したデフォルト言語(en_GBと仮定)のデータフレーム列名を保持し、それらを単にコピーします。

    df_ger.columns = df_uk.columns
    df_combined = pd.concat([df_ger, df_uk], axis=0, ignore_index=True)
    

    これは、列名に関係なく機能します。ただし、技術的には名前を変更したままです。

  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"])
    

    このソリューションはより多くのリソースを必要とするため、最初のソリューションを選択します。

2
C. Nitschke

これがあなたが思っていたよりも簡単かどうかはわかりませんが、主な目標が一般的なものである場合、これは1つの仮定でうまくいくはずです:たとえば、日付が最初の列である場合、2つのファイルの列は一致します翻訳バージョンも最初の列になります。

# 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
1
osbon123