[英]How to replace column value with another rows column value based on condition using pandas?
[英]Replace value from a column based on condition of another column, Pandas
首发DataFrame
df = pd.DataFrame({'Column A' : ['red','green','yellow', 'orange', 'red', 'blue'],
'Column B' : [NaN, 'blue', 'purple', NaN, NaN, NaN],
'Column C' : [1, 2, 3, 2, 3, 7]})
A列 | B列 | 专栏C |
---|---|---|
'红色的' | 钠盐 | 1个 |
'绿色' | '蓝色的' | 2个 |
'黄色' | '紫色的' | 3个 |
'橘子' | 钠盐 | 2个 |
'红色的' | 钠盐 | 3个 |
'蓝色的' | 钠盐 | 7 |
期望的结果
A列 | B列 | 专栏C |
---|---|---|
'红色的' | 钠盐 | 1个 |
'蓝色的' | '蓝色的' | 2个 |
'紫色的' | '紫色的' | 3个 |
'橘子' | 钠盐 | 2个 |
'红色的' | 钠盐 | 3个 |
'蓝色的' | 钠盐 | 7 |
我想仅当 B 列中的值不是 NaN 时才替换 A 列中的值,并将 A 列替换为 B 列中的值
这样我就可以运行以下代码:
df[[Column_A, Column_C]].groupby(Column_A).sum()
这将导致以下 DataFrame:
A列 | 专栏C |
---|---|
'红色的' | 4个 |
'蓝色的' | 9 |
'紫色的' | 3个 |
'橘子' | 2个 |
我正在尝试在进行groupby
调用之前替换类别。
尝试:
我正在使用的 DataFrame 有一个从 0 到 N 的基于顺序数字的索引。
所以我可以硬编码以下内容:
df.iloc[[index], column] = some_string
我不想这样做,因为它不是动态的,并且 DataFrame 数据可能会更改。
我相信我可以在df
或.apply()
上使用.agg()
或 .apply( df.groupby()
但这是我一直在努力的地方。
特别是如何编写 function 以与.agg()
或.apply()
一起使用
说:
def my_func(x):
print(x)
然后:
df.apply(my_func)
结果是df
打印的第一列。
或者:
df.apply(my_func, axis = 1)
结果是每行的以下格式:
Column A red
Column B Nan
Column C 1
Name: 0, dtype: object
Column A green
Column B blue
Column C 2
Name: 1, dtype: object
我不确定如何访问my_func
中每行的每一列。
编辑:
如果 B 列中该行的值不是 NaN,我试图找到一种方法来更改 A 列中的值。 用于替换的值是 B 列中的值,如果 B 列不是 NaN,则要替换的值是 A 列中的值。
但我想动态地执行此操作,这意味着不像我展示的那样硬编码:
df.iloc[[index], column] = some_string
正如您提到的,您可以像这样使用pd.apply
:
df['Column A'] = df.apply(lambda x: x['Column B'] if str(x['Column B']) not in ['nan', 'NaN'] else x['Column A'], axis=1)
Column A Column B Column C
0 red NaN 1
1 blue blue 2
2 purple purple 3
3 orange NaN 2
4 red NaN 3
5 blue NaN 7
请注意,对于非常大的数据集,应用速度不快是不可取的。 对于替代方法,有一些很好的答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.