Python 如何";重排;在列之间使用映射的数据帧?

Python 如何";重排;在列之间使用映射的数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我不熟悉熊猫和数据帧,所以我希望这不是一个太基本的问题 假设我(外部)合并了两个数据帧并获得以下结果: 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

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

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

     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
到目前为止,这正是我想要的(日期都是同一天)

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

我可能有没有映射到任何符号a的符号b(如上面的索引6)

我的问题是,是否可以使用根据字典提供的映射重新排列行,以便获得:

     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
6     NaN       NaN      NaN      NaN   GGGG     yymmdd      2       S       NaN
理想情况下,我还希望去掉所有包含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

因此,我将您的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中的结果现在是:

    date_a  symbol_a    value_a type_a  date_b  symbol_b    value_b type_b  mapping total
0   yymmdd  AAAA        10.0    W       yymmdd  AAAA        2.0     S       AAAA    12.0
1   yymmdd  BBBB        5.0     W       yymmdd  BBBB        2.0     S       BBBB    7.0
2   yymmdd  CCCC        12.0    W       yymmdd  EEEE        5.0     S       CCCC    17.0
3   yymmdd  DDDD        15.0    W       yymmdd  FFFF        10.0    S       DDDD    25.0

我认为从原始的2数据帧开始要容易得多。你能解释一下映射是如何工作的吗?我看不到。根据他提供的dict,带“b”的列与“a”合并,这意味着在他合并时从下方移动到正确的行。我同意@PhungDuyPhong。从原始文件开始,创建一个额外的列以基于映射连接DFs,使用内部连接,然后使用.dropna()抱歉,可能不清楚。基本上我需要符号a和b的值之和。其中一些我可以在合并数据帧时自动获取(因为符号是相同的),但另一些则不是。但是,我知道如何将哪个符号与哪个符号相关联。实际情况是symbol_a是symbol_b的长度为4的子串。当后者的长度为EEEE时,用于创建
total
列:
df1['total']=df1.apply(lambda x:x['value\u a']+x['value\u b'],axis=1)
您不需要
apply
。这应该也可以用
df1['total']=df1['value\u a']+df1['value\u b']
@PhungDuyPhong谢谢,这似乎很好用+1现在让我检查一下实际情况是如何整合的,稍后我会接受答案。有一个问题,你能解释一下“类型(mapper.get('fdasf'))”行吗?再次感谢。@Tommy很抱歉,这没有关系,我只是测试结果,看看当我得到一个不存在的密钥时我收到了什么
    date_a  symbol_a    value_a type_a  date_b  symbol_b    value_b type_b  mapping total
0   yymmdd  AAAA        10.0    W       yymmdd  AAAA        2.0     S       AAAA    12.0
1   yymmdd  BBBB        5.0     W       yymmdd  BBBB        2.0     S       BBBB    7.0
2   yymmdd  CCCC        12.0    W       yymmdd  EEEE        5.0     S       CCCC    17.0
3   yymmdd  DDDD        15.0    W       yymmdd  FFFF        10.0    S       DDDD    25.0