[英]Change cell value with condition
我有一个 dataframe:
df = pd.DataFrame(
{'a': ['banana', 'coconut', 'banana', 'apple'],
'b': ['rice', 'bean', 'rice', 'soap'],
'c': ['mouse', 'dog', None,'apple'],
'd': ['cat', 'soap', 'beef', 'rabbit']}
)
a b c d
0 banana rice mouse cat
1 coconut bean dog soap
2 banana rice None cat
3 apple soap apple rabbit
如果一行包含值 None(此处在索引 2 中),我们将查找其值完全相同的行,并将 None 的值更改为同一列的值。 因此,此处索引 0 的行和索引 2 的行具有相同的值,但“c”列除外。 然后我们将 None 更改为 'cat' 因此预期结果是:
a b c d
0 banana rice mouse cat
1 coconut bean dog soap
2 banana rice mouse cat
3 apple soap apple rabbit
Quelqu'un à une solution à cette probleme, 谢谢
df.loc[df['c'].isnull(), 'c'] = df[df.duplicated(subset = ['a', 'b'], keep = 'last')]['c'].values
df
Output:
|index| a | b | c | d |
|-----|---------|----|-----|------|
| 0 | banana |rice|mouse| cat |
| 1 | coconut |bean| dog | soap |
| 2 | banana |rice|mouse| beef |
| 3 | apple |soap|apple|rabbit|
这段代码可以解决任意数量的None
问题:
In [183]: df = pd.DataFrame(
...: {'a': ['banana', 'coconut', 'banana', 'apple', None],
...: 'b': ['rice', 'bean', 'rice', 'soap', 'soap'],
...: 'c': ['mouse', 'dog', None, 'apple', 'apple'],
...: 'd': ['cat', 'soap', 'cat', 'rabbit', None]}
...: )
In [184]: df
Out[184]:
a b c d
0 banana rice mouse cat
1 coconut bean dog soap
2 banana rice None cat
3 apple soap apple rabbit
4 None soap apple None
In [185]: rows = df.isnull().any(axis=1).to_numpy().nonzero()[0] # rows with None
...: for i in rows:
...: row = df.iloc[i]
...: cols = df.columns[row.notnull()] # columns without None
...: replacement = (df[cols] == row[cols]).all(axis=1).to_numpy().nonzero()[0]
...: for j in replacement:
...: if i != j:
...: df.loc[i] = df.loc[j]
...: break
In [186]: df
Out[186]:
a b c d
0 banana rice mouse cat
1 coconut bean dog soap
2 banana rice mouse cat
3 apple soap apple rabbit
4 apple soap apple rabbit
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.