熊猫:根据列中的条件测试替换记录

时间:2017-11-16 04:44:50

标签: python pandas replace conditional records

我在数据框中有唯一的记录,没有重复记录,这是由多个列的值组合决定的:

import pandas as pd
d = {'Alpha' : ['C', 'B', 'C','D', 'A', 'A'], 'Beta' : ['G', 'F', 'G', 'H', 'A', 'A'],'Year': ['Base', 88, 94, 22, 'Base', 66], 'Zulu' : [1, 2, -3, 4, 5, -3]}
df = pd.DataFrame(d)   

这让我们:

  Alpha Beta  Year  Zulu
0     C    G  Base     1
1     B    F    88     2
2     C    G    94    -3
3     D    H    22     4
4     A    A  Base     5
5     A    A    66    -4

指数0与指数2近似匹配,&索引4是与索引5的近似匹配,除了年份'年份。指数0&的价值index 4是Base,' Zulu'指数2&的价值5是否定的。我想取代负面的祖鲁人' 2和2中的值5在索引0和0中具有相应的祖鲁值。 4,不破坏其他行。输出df如下所示:

  Alpha Beta  Year  Zulu
0     C    G  Base     1
1     B    F    88     2
2     C    G    94     1
3     D    H    22     4
4     A    A  Base     5
5     A    A    66     5

我可以轻松地开始使用过滤器和放大器。深层复制,以避免切片问题,&然后备份原始数据:

df_sub = df[df.Zulu < 0].copy(deep=True)
df_sub['Zulu_backup'] = df_sub.Zulu

然后我可以使用df_sub与原始文件合并:

df_result = pd.merge(df_sub, df, how='right')

导致:

Alpha Beta  Year    Zulu     Zulu_backup
0     C    G    94    -3         -3.0
1     A    A    66    -3         -3.0
2     C    G  Base     1          NaN
3     B    F    88     2          NaN
4     D    H    22     4          NaN
5     A    A  Base     5          NaN

但我不知道从哪里开始,而不会弄乱数据框的其他行。我有一个相当复杂的脚本。我猜我可以创建一个系列并将其映射到数据框,但我不知道如何这样做。迭代这个不是一个选项,因为我有数百万行。非常感谢任何协助。

2 个答案:

答案 0 :(得分:3)

一种方法是将Zulu中的负值转换为nan,然后将fillna转换为

df.loc[df['Zulu'] < 0, 'Zulu'] = np.nan
df['Zulu'] = df.groupby(['Alpha', 'Beta']).Zulu.apply(lambda x: x.ffill().bfill()).astype(int)


    Alpha   Beta    Year    Zulu
0   C       G       Base    1
1   B       F       88      2
2   C       G       94      1
3   D       H       22      4
4   A       A       Base    5
5   A       A       66      5

答案 1 :(得分:3)

编辑:

df.Zulu=df.Zulu.mask(df.Zulu.lt(0))

df.Zulu=df.set_index(['Alpha','Beta']).Zulu.fillna(df.set_index(['Alpha','Beta']).dropna().Zulu).values
df
Out[89]: 
  Alpha Beta  Year  Zulu
0     C    G  Base   1.0
1     B    F    88   2.0
2     C    G    94   1.0
3     D    H    22   4.0
4     A    A  Base   5.0
5     A    A    66   5.0