在Pandas

时间:2018-05-28 11:49:38

标签: python list pandas dataframe mapping

我需要一些有点棘手的映射帮助。

映射干净的一个值并不困难,但现在我在一个单元格中有多个值可以映射。没有规则可以有多少个值,但最常见的是1到4之间。

数据框如下所示:

df:
flag   id
 1   [A],[D]
 2   [B]
 3   [D],[E]
 3   [B],[C]

df1:
id   col1     col2     col3
A     on        1      true
B     on        2      true
C     off       4      true
D     off       4      false
E     on        2      true

df2:
id   col1     col2     col3
A     on        1      true
B     on        2      true
C     off       4      true
D     off       4      false
E     on        2      true

df3:
id   col1     col2     col3
A     on        4      true
B     off       6      true
C     off       4      false
D     on        3      false
E     on        2      true

我需要映射所有三列(col1,col2,col3),所以我将它附加到一列,这就是它需要的方式。

df1['Description'] = df1['col1'] + ', ' + df1['col2'] + ', ' + df1['col3']

同样适用于df2和df3。 并且取决于来自df的列“flag”,我将从中获取数据帧,1来自df1,2来自d2,3来自df3。 现在我遇到了很多硬编码问题,我开始分成多行(df ['id']列表中的每个值)然后映射,很多groupby和合并,很有可能失败一点。

那么,如果有任何步骤只是从另一个数据帧解析和映射,而不将列值拆分成多个列或行?

我尝试过这样的事情:

for a in df['flag'].values:
    if a == '1':
        df['Description'] = df['id'].map(df1.set_index('id')['Description'])
    elif a == '2':
        df['Description'] = df['id'].map(df2.set_index('id')['Description'])
    elif a == '3':
        df['Description'] = df['id'].map(df3.set_index('id')['Description'])
    else:
        df['Description'] = 'No RAT data'

但我得到的是NaN值。 期望的输出:

flag   id        Description
 1   [A],[D]   (on, 1, true), (off, 4, false)
 2   [B]       (on, 2, true)
 3   [D],[E]   (on, 2, true), (on, 2, true)
 3   [B],[C]   (off, 6, true), (off, 4, false)

欢迎任何形式的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,你必须定义一个新的数据帧,如

d = {'col1':[0,0,0,0,0],'col2':[0,0,0,0,0],'col3':[0,0,0,0,0]}
new_df = pd.DataFrame(d)
new_df['col1']=df1['col1']
new_df['col2']=df1['col2']
new_df['col3']=df1['col3']

检查