我在数据框中有唯一的记录,没有重复记录,这是由多个列的值组合决定的:
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
但我不知道从哪里开始,而不会弄乱数据框的其他行。我有一个相当复杂的脚本。我猜我可以创建一个系列并将其映射到数据框,但我不知道如何这样做。迭代这个不是一个选项,因为我有数百万行。非常感谢任何协助。
答案 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