如何使用列之间的映射“重新排列”pandas数据帧?

2024-05-16 11:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉熊猫和数据帧,所以我希望这不是一个太基本的问题。在

假设我(外部)合并了两个数据帧,得到了以下结果:

     date_a  symbol_a  value_a  type_a symbol_b  date_b  value_b  type_b    total
0    yymmdd    AAAA       10       W    AAAA     yymmdd     2        S        12
1    yymmdd    BBBB        5       W    BBBB     yymmdd     2        S         7
2    yymmdd    CCCC       12       W     NaN        NaN     NaN     NaN      NaN
3    yymmdd    DDDD       15       W     NaN        NaN     NaN     NaN      NaN
4     NaN       NaN      NaN      NaN   EEEE     yymmdd      5       S       NaN
5     NaN       NaN      NaN      NaN   FFFF     yymmdd     10       S       NaN
6     NaN       NaN      NaN      NaN   GGGG     yymmdd      2       S       NaN

到目前为止,这正是我想要的(日期都是同一天)。在

现在假设我有一个规则,告诉我我有一个映射(字典):

^{pr2}$

我可能有没有映射到任何符号_a的符号_b(如上面的索引6)。在

我的问题是,是否可以根据字典给出的映射使用“重新排列行”来获得:

^{3}$

理想情况下,我还希望删除包含NaN元素的所有行,这样最终结果将是:

     date_a  symbol_a  value_a  type_a symbol_b  date_b  value_b  type_b    total
0    yymmdd    AAAA       10       W    AAAA     yymmdd     2        S        12
1    yymmdd    BBBB        5       W    BBBB     yymmdd     2        S         7
2    yymmdd    CCCC       12       W    EEEE     yymmdd     5        S        17
3    yymmdd    DDDD       15       W    FFFF     yymmdd     10       S        25

Tags: 数据date字典valuetypenansymbolcccc
1条回答
网友
1楼 · 发布于 2024-05-16 11:28:13

因此,我将您的dataframe拆分为原来的2个dataframe,只需更改dataframe中列的名称,以适合您的使用:

import pandas as pd

a = pd.read_csv('test.csv')

#Split your merge df into 2 original df
del a['total']
df1 = a.loc[:, ['date_a', 'symbol_a', 'value_a', 'type_a']]
df2 = a.loc[:, ['date_b', 'symbol_b', 'value_b', 'type_b']]

df1.fillna('', inplace=True)
df2.fillna('', inplace=True)

df1 = df1[df1['date_a']!='']
df2 = df2[df2['date_b']!='']

#Add a mapping column to df2
mapper = {'EEEE':'CCCC', 'FFFF':'DDDD'}

df2['mapping'] = df2['symbol_b'].apply(lambda x: mapper.get(x) if mapper.get(x)!= None else x)

df1 = df1.merge(df2, left_on='symbol_a', right_on='mapping')
df1['total'] = df1['value_a'] + df1['value_b']
df1

df1中的结果现在是:

^{pr2}$

相关问题 更多 >