簡體   English   中英

如何使用列之間的映射“重新排列”熊貓數據框?

[英]How to “rearrange” a pandas data-frame using a map between columns?

我是熊貓和數據框架的新手,所以我希望這不是一個太基本的問題。

假設我(外部)合並了兩個數據幀並獲得了以下內容:

     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

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

現在,假設我有一條規則告訴我我有一個映射(字典):

mapper = {'EEEE':'CCCC', 'FFFF':'DDDD'}

我可能有沒有映射到任何symbol_a的symbol_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

因此,我將您的數據框拆分為原始的2個數據框,只需更改數據框中的列名稱以適合您的用法即可:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM