繁体   English   中英

根据条件对多列应用定义 - python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM