[英]Apply definition on multiple columns based on conditions- python
我有 dataframe,当一列等于“02”时,我想要将定义应用于其他 5 列。 这是我的代码:
mask = (df['A']=='02')
z_valid = df[mask]
df.loc[((mask) & (df['B'] !=0)), 'B'] = z_valid['B'].apply(def)
df.loc[((mask) & (df['C'] !=0)), 'C'] = z_valid['C'].apply(def)
df.loc[((mask) & (df['D'] !=0)), 'D'] = z_valid['D'].apply(def)
df.loc[((mask) & (df['E'] !=0)), 'E'] = z_valid['E'].apply(def)
df.loc[((mask) & (df['F'] !=0)), 'F'] = z_valid['F'].apply(def)
我收到此错误:“ValueError:使用可迭代设置时必须具有相等的 len 键和值”
但是当我只在 2 列上应用 def 时,这段代码有效:
mask = (df['A']=='02')
z_valid = df[mask]
df.loc[((mask) & (df['B'] !=0)), 'B'] = z_valid['B'].apply(def)
df.loc[((mask) & (df['C'] !=0)), 'C'] = z_valid['C'].apply(def)
我该如何解决这个错误? 提前致谢。
它引发了一个异常,因为 'D' 是一个空Series
:
假设以下 dataframe:
df = pd.DataFrame({'A': ['01', '02', '02', '02'], 'B': [9, 1, 2, 3], 'C': [9, 1, 2, 3], 'D': [9, 0, 0, 0]})
print(df)
# Output:
A B C D
0 01 9 9 9
1 02 1 1 0
2 02 2 2 0
3 02 3 3 0
现在,如果我尝试您的代码:
def f(sr):
return 2*sr
mask = (df['A']=='02')
z_valid = df[mask]
df.loc[((mask) & (df['B'] !=0)), 'B'] = z_valid['B'].apply(f)
df.loc[((mask) & (df['C'] !=0)), 'C'] = z_valid['C'].apply(f)
df.loc[((mask) & (df['D'] !=0)), 'D'] = z_valid['D'].apply(f)
Output:
----> 8 df.loc[((mask) & (df['D'] !=0)), 'D'] = z_valid['D'].apply(f)
...
ValueError: Must have equal len keys and value when setting with an iterable
在“D”上引发异常:
# Left side
>>> df.loc[((mask) & (df['D'] !=0)), 'D']
Series([], Name: E, dtype: int64) # <- Empty Series
# Right side
>>> z_valid['D'].apply(f)
1 0
2 0
3 0
Name: E, dtype: int64
如果我理解您可以使用.where
和.applymap
的要求,如下例所示:
import pandas as pd
df = pd.DataFrame({"x" : ['01', '02', '03', '04', '02', '05', '02'],
"y": [3,3,3,3,3,3,3],
'z': [6,6, 6, 6, 6, 6, 6]
})
cols = ['y', 'z']
def func(x):
return 2*x
df[cols] = df[cols].where(df['x'] != '02', df[cols].applymap(func))
print(df)
这使:
x y z
0 01 3 6
1 02 6 12
2 03 3 6
3 04 3 6
4 02 6 12
5 05 3 6
6 02 6 12
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.