标识该数据是一个数据框还是函数中的数据框列表



我有一些计算,我想运行,我已经包装成一个函数。然而,我的数据有时可以是一个数据框或一个数据框列表。在我看来,它们的迭代方式不同。我不知道如何在我的函数中包含这个逻辑。

示例数据

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')

有两个问题:

  1. 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().
  2. 我想避免编写计算(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)}')

如果输入是listtuple,您将对输入的每一项递归调用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)将改变df1df2:
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

最新更新