我有一些计算,我想运行,我已经包装成一个函数。然而,我的数据有时可以是一个数据框或一个数据框列表。在我看来,它们的迭代方式不同。我不知道如何在我的函数中包含这个逻辑。
示例数据
d2 = {'id': [1, 3, 4, 5, 7], 'is_free': [True, True, False, False, False], 'level': ['Top', 'High', 'Top', 'Top', 'Low']}
d1 = pd.DataFrame(data=d1)
d2 = pd.DataFrame(data=d2)
df_list = [d1, d2]
df = pd.DataFrame(data=d2)
函数:我试图让函数在运行计算之前识别df或df_list=None。
def calculation(df_list=None, df=None):
if df != None:
df['result'] = df['level'].apply(lambda x: '1' if x == 'Top' else '0')
elif df_list != None:
for i, df in enumerate(df_list):
df['result'] = df['level'].apply(lambda x: '1' if x == 'Top' else '0')
有两个问题:
calculation(df_list=df_list, df=None)
返回预期结果,但calculation(df_list=None, df=df)
返回ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
- 我想避免编写计算(
df['result'] = df['level'].apply(lambda x: '1' if x == 'Top' else '0')
)两次,以保持函数简洁,因为实际计算很长。
您可以检查calculation
函数中的输入类型,并根据该类型采取不同的操作:
def calculation(df):
if isinstance(df, pd.DataFrame):
df['result'] = df['level'].apply(lambda x: '1' if x == 'Top' else '0')
elif isinstance(df, (list, tuple)):
list(map(calculation, df))
else:
raise TypeError(f'Unknown type: {type(df)}')
如果输入是list
或tuple
,您将对输入的每一项递归调用calculation
。如果输入是DataFrame
,则可以对其应用函数(这是递归的基本情况)。
如果你有:
df1 = pd.DataFrame(data={'id': [1, 3, 4, 5, 7], 'is_free': [True, True, False, False, False], 'level': ['Top', 'High', 'Top', 'Top', 'Low']})
df2 = pd.DataFrame(data={'id': [1, 3, 4, 5, 7], 'is_free': [True, True, False, False, False], 'level': ['Top', 'Top', 'Top', 'High', 'Low']})
df3 = pd.DataFrame(data={'id': [1, 3, 4, 5, 7], 'is_free': [True, True, False, False, False], 'level': ['High', 'Top', 'Low', 'High', 'Low']})
df_list = [df1, df2]
df_list_nested = [df1, [df2, df3]]
然后运行calculation(df1)
,你得到:
df1
id is_free level result
0 1 True Top 1
1 3 True High 0
2 4 False Top 1
3 5 False Top 1
4 7 False Low 0
df2
id is_free level
0 1 True Top
1 3 True Top
2 4 False Top
3 5 False High
4 7 False Low
df3
id is_free level
0 1 True High
1 3 True Top
2 4 False Low
3 5 False High
4 7 False Low
另一方面,calculation(df_list)
将改变df1
和df2
:
df1
id is_free level result
0 1 True Top 1
1 3 True High 0
2 4 False Top 1
3 5 False Top 1
4 7 False Low 0
df2
id is_free level result
0 1 True Top 1
1 3 True Top 1
2 4 False Top 1
3 5 False High 0
4 7 False Low 0
df3
id is_free level
0 1 True High
1 3 True Top
2 4 False Low
3 5 False High
4 7 False Low
但是这个函数甚至可以在嵌套列表中工作,比如df_list_nested
;calculation(df_list_nested)
将改变所有的列表:
df1
id is_free level result
0 1 True Top 1
1 3 True High 0
2 4 False Top 1
3 5 False Top 1
4 7 False Low 0
df2
id is_free level result
0 1 True Top 1
1 3 True Top 1
2 4 False Top 1
3 5 False High 0
4 7 False Low 0
df3
id is_free level result
0 1 True High 0
1 3 True Top 1
2 4 False Low 0
3 5 False High 0
4 7 False Low 0