[英]How to replace column values based on other columns in pandas?
假设,我有一个数据框,例如
import pandas as pd
df = pd.DataFrame({'visitor':['A','B','C','D','E'],
'col1':[1,2,3,4,5],
'col2':[1,2,4,7,8],
'col3':[4,2,3,6,1]})
游客 | col1 | 列2 | 列3 |
---|---|---|---|
一种 | 1个 | 1个 | 4个 |
乙 | 2个 | 2个 | 2个 |
C | 3个 | 4个 | 3个 |
丁 | 4个 | 7 | 6个 |
乙 | 5个 | 8个 | 1个 |
对于每一行/访问者,(1) 首先,如果有任何相同的值,我想保留每行的第一个值,然后用 NULL 替换同一行中相同值的 rest,例如
游客 | col1 | 列2 | 列3 |
---|---|---|---|
一种 | 1个 | NULL | 4个 |
乙 | 2个 | NULL | NULL |
C | 3个 | 4个 | NULL |
丁 | 4个 | 7 | 6个 |
乙 | 5个 | 8个 | 1个 |
然后 (2) 保留具有超过 1 个值的行/访问者,例如
最终数据框
游客 | col1 | 列2 | 列3 |
---|---|---|---|
一种 | 1个 | NULL | 4个 |
C | 3个 | 4个 | NULL |
丁 | 4个 | 7 | 6个 |
乙 | 5个 | 8个 | 1个 |
有什么建议么? 非常感谢
我们可以沿列轴使用series.duplicated
来识别重复项,然后使用where
屏蔽重复项并过滤非重复值之和大于 1 的行
s = df.set_index('visitor')
m = ~s.apply(pd.Series.duplicated, axis=1)
s.where(m)[m.sum(1).gt(1)]
col1 col2 col3
visitor
A 1 NaN 4.0
C 3 4.0 NaN
D 4 7.0 6.0
E 5 8.0 1.0
让我们尝试使用pd.Series.duplicated
进行mask
,然后使用thresh
进行dropna
out = df.mask(df.apply(pd.Series.duplicated,1)).dropna(thresh = df.shape[1]-1)
Out[321]:
visitor col1 col2 col3
0 A 1 NaN 4.0
2 C 3 4.0 NaN
3 D 4 7.0 6.0
4 E 5 8.0 1.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.