pandas 当panda Dataframe 列成对时插入它们

emeijp43  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(96)

预期结果如下:

id name
1    A
2    B
3    C
4    D
5    E
6    F
7    G
8    H

目前我是这样做的:

import pandas as pd

df = pd.DataFrame({'home_id':   ['1', '3', '5', '7'],
                   'home_name': ['A', 'C', 'E', 'G'],
                   'away_id':   ['2', '4', '6', '8'],
                   'away_name': ['B', 'D', 'F', 'H']})

id_col = pd.concat([df['home_id'], df['away_id']])
name_col = pd.concat([df['home_name'], df['away_name']])

result = pd.DataFrame({'id': id_col, 'name': name_col})
result = result.sort_index().reset_index(drop=True)

print(result)

但是这种形式使用索引对列进行重新分类,在索引相等的情况下可能会产生错误。
如何插入列值始终为:
先用一线的主场,再用一线的客场,再用二线的主场,再用二线的客场等等......

3duebb1j

3duebb1j1#

试试这个:

out = pd.DataFrame(df.values.reshape(-1, 2), columns=['ID', 'Name'])
print(out)
>>>
    ID  Name
0   1   A
1   2   B
2   3   C
3   4   D
4   5   E
5   6   F
6   7   G
7   8   H
92dk7w1h

92dk7w1h2#

与python zip类似,您可以遍历两个 Dataframe :

home = pd.DataFrame(df[['home_id', 'home_name']].values, columns=('id', 'name'))
away = pd.DataFrame(df[['away_id', 'away_name']].values, columns=('id', 'name'))

def zip_dataframes(df1, df2):
    rows = []
    for i in range(len(df1)):
        rows.append(df1.iloc[i, :])
        rows.append(df2.iloc[i, :])

    return pd.concat(rows, axis=1).T

zip_dataframes(home, away)

  id name
0  1    A
0  2    B
1  3    C
1  4    D
2  5    E
2  6    F
3  7    G
3  8    H
kb5ga3dv

kb5ga3dv3#

您可以使用pd.wide_to_long并对列标题进行少量重命名来完成此操作:

import pandas as pd

df = pd.DataFrame({'home_id':   ['1', '3', '5', '7'],
                   'home_name': ['A', 'C', 'E', 'G'],
                   'away_id':   ['2', '4', '6', '8'],
                   'away_name': ['B', 'D', 'F', 'H']})

dfr = df.rename(columns=lambda x: '_'.join(x.split('_')[::-1])).reset_index()

df_out = (pd.wide_to_long(dfr, ['id', 'name'],  'index', 'No', sep='_', suffix='.*')
            .reset_index(drop=True)
            .sort_values('id'))

df_out

输出:

id name
0  1    A
4  2    B
1  3    C
5  4    D
2  5    E
6  6    F
3  7    G
7  8    H

相关问题