在多列的多个数据框中申请循环?
Apply for loop in multiple dataframe for multiple columns?
数据框如下所示:如果年龄超过 100 岁,我想将数据框值更改为 'dead'。
import pandas as pd
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
期望的结果
df=
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c
df2=
age1 age2 name
0 80 70 a
1 90 dead b
2 dead 90 c
我正在尝试这样的事情:
col_list=['age1','age2']
df_list=[df,df2]
def dead(df):
for df in df_list:
if df.columns in col_list:
if df.columns >=100:
return 'dead'
else:
return df.columns
df.apply(dead)
显示的错误:
具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()
我正在寻找适用于所有数据帧的循环。
请更正我的功能,以备日后学习:)
我做了以下事情:
col_list=['age1','age2']
df_list=[df,df2]
for d in df_list:
for c in col_list:
d.loc[d[c]>100, c] = 'dead'
使用您显示的示例,请尝试执行以下操作。分别使用pandas、numpy的filter
, np.where
函数。
c = df.filter(regex='age\d+').columns
df[c] = np.where(df[c].ge(100),'dead',df[c])
df
where
的替代方法:
c=df.filter(like='age').columns
df[c] = df[c].where(~df['c'].ge(100),'dead')
解释:
- 在 c 变量中获取与
age
同名的列。
- 然后使用
np.where
检查各个(所有年龄列)是否为greeter/equal到100,如果是则将其设置为死或保持原样。
一种可能的解决方案是使用 Pandas' mask
,它与 if-else
类似,但已矢量化。
def dead(df):
col_list = ['age1', 'age2']
df = df.copy()
temporary = df.filter(col_list)
temporary = temporary.mask(temporary >= 100, "dead")
df.loc[:, col_list] = temporary
return df
将函数应用于数据框:
df.pipe(dead)
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c
你可以这样做:
def check_more_than_100(x):
v = None
try:
v = int(x)
except:
pass
if v is not None:
return (v > 100)
return (False)
df['age1'] = df['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df['age2'] = df['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df2['age1'] = df2['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df2['age2'] = df2['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
这应该处理非整数值(如果有的话)。
我用 来回答类似的问题。基本上你可以使用 numpy 中的 .where() 函数来根据条件进行设置。
import pandas as pd
import numpy as np
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
col_list=['age1','age2']
df_list=[df,df2]
def dead(df_list, col_list):
for df in df_list:
for col in col_list:
df[col] = np.where(df[col] >= 100, "dead", df[col])
return df_list
df
dead([df], col_list)
提取数字列然后使用 numpy where -
df_cols = df._get_numeric_data().columns.values
df2_cols = df2._get_numeric_data().columns.values
df[df_cols] = np.where(df[df_cols].to_numpy() > 100, 'dead', df[df_cols])
df2[df2_cols] = np.where(df2[df2_cols].to_numpy() > 100, 'dead', df2[df2_cols])
#inspired by @jib and @ravinder
col_list=['age1','age2']
df_list=[df,df2]
for d in df_list:
for c in col_list:
d[c]=np.where(d[c]>100,'dead',d[c])
df #or df2
输出:
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c
数据框如下所示:如果年龄超过 100 岁,我想将数据框值更改为 'dead'。
import pandas as pd
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
期望的结果
df=
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c
df2=
age1 age2 name
0 80 70 a
1 90 dead b
2 dead 90 c
我正在尝试这样的事情:
col_list=['age1','age2']
df_list=[df,df2]
def dead(df):
for df in df_list:
if df.columns in col_list:
if df.columns >=100:
return 'dead'
else:
return df.columns
df.apply(dead)
显示的错误: 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()
我正在寻找适用于所有数据帧的循环。
请更正我的功能,以备日后学习:)
我做了以下事情:
col_list=['age1','age2']
df_list=[df,df2]
for d in df_list:
for c in col_list:
d.loc[d[c]>100, c] = 'dead'
使用您显示的示例,请尝试执行以下操作。分别使用pandas、numpy的filter
, np.where
函数。
c = df.filter(regex='age\d+').columns
df[c] = np.where(df[c].ge(100),'dead',df[c])
df
where
的替代方法:
c=df.filter(like='age').columns
df[c] = df[c].where(~df['c'].ge(100),'dead')
解释:
- 在 c 变量中获取与
age
同名的列。 - 然后使用
np.where
检查各个(所有年龄列)是否为greeter/equal到100,如果是则将其设置为死或保持原样。
一种可能的解决方案是使用 Pandas' mask
,它与 if-else
类似,但已矢量化。
def dead(df):
col_list = ['age1', 'age2']
df = df.copy()
temporary = df.filter(col_list)
temporary = temporary.mask(temporary >= 100, "dead")
df.loc[:, col_list] = temporary
return df
将函数应用于数据框:
df.pipe(dead)
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c
你可以这样做:
def check_more_than_100(x):
v = None
try:
v = int(x)
except:
pass
if v is not None:
return (v > 100)
return (False)
df['age1'] = df['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df['age2'] = df['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df2['age1'] = df2['age1'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
df2['age2'] = df2['age2'].apply(lambda x : 'dead' if check_more_than_100(x) else x)
这应该处理非整数值(如果有的话)。
我用
import pandas as pd
import numpy as np
raw_data = {'age1': [23,45,210],'age2': [10,20,150],'name': ['a','b','c']}
df = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
raw_data = {'age1': [80,90,110],'age2': [70,120,90],'name': ['a','b','c']}
df2 = pd.DataFrame(raw_data, columns = ['age1','age2','name'])
col_list=['age1','age2']
df_list=[df,df2]
def dead(df_list, col_list):
for df in df_list:
for col in col_list:
df[col] = np.where(df[col] >= 100, "dead", df[col])
return df_list
df
dead([df], col_list)
提取数字列然后使用 numpy where -
df_cols = df._get_numeric_data().columns.values
df2_cols = df2._get_numeric_data().columns.values
df[df_cols] = np.where(df[df_cols].to_numpy() > 100, 'dead', df[df_cols])
df2[df2_cols] = np.where(df2[df2_cols].to_numpy() > 100, 'dead', df2[df2_cols])
#inspired by @jib and @ravinder
col_list=['age1','age2']
df_list=[df,df2]
for d in df_list:
for c in col_list:
d[c]=np.where(d[c]>100,'dead',d[c])
df #or df2
输出:
age1 age2 name
0 23 10 a
1 45 20 b
2 dead dead c