问:对 pandas 数据框字典的字典理解,具有多个输出的函数
Q: Dict comprehension on a dictionary of pandas dataframes, with a function with multiple outputs
我有一个字典,其中包含 pandas 个具有相应键的数据帧:
import pandas as pd
df_dict = pd.read_excel('/directory/data.xlsx', sheet_name=None)
其中键是 excel 文件的 sheet 名称。
是否可以通过使用具有两个输出的函数来使用字典理解来创建两个 pandas 数据帧的新字典? :
def somefunction(df):
#Does something
df1 = df.apply(lambda x: x*2)
df2 = df.apply(lambda x: x*4)
return df1, df2
df_dict1, df_dict2 = {key: somefunction(df) for (key, df) in df_dict.items()}
#Does not work..
我知道在使用列表时可以使用 zip(*)
关键字,但它似乎不适用于字典
df_dict1, df_dict2 = zip(*{key: somefunction(df) for (key, df) in df_dict.items()})
#Does not work either
两者都return
too many values to unpack (expected 2)
你的字典理解不对。我认为您正在尝试执行以下操作:
def somefunction(df):
#Does something
df1 = df.apply(lambda x: x*2)
df2 = df.apply(lambda x: x*4)
return [df1, df2]
processed_dicts = [list(zip([key]*2, somefunction(df))) for (key, df) in df_dict.items()]
df_dict1 = dict([x[0] for x in processed_dicts])
df_dict2 = dict([x[1] for x in processed_dicts])
您不能压缩字典,但您可以压缩它们的项目并从项目列表中构建字典。在这里你可以做:
[dict(t) for t in zip(*(tuple((key,v) for v in somefunction(val))
for key,val in df_dict.items()))]
我有一个字典,其中包含 pandas 个具有相应键的数据帧:
import pandas as pd
df_dict = pd.read_excel('/directory/data.xlsx', sheet_name=None)
其中键是 excel 文件的 sheet 名称。
是否可以通过使用具有两个输出的函数来使用字典理解来创建两个 pandas 数据帧的新字典? :
def somefunction(df):
#Does something
df1 = df.apply(lambda x: x*2)
df2 = df.apply(lambda x: x*4)
return df1, df2
df_dict1, df_dict2 = {key: somefunction(df) for (key, df) in df_dict.items()}
#Does not work..
我知道在使用列表时可以使用 zip(*)
关键字,但它似乎不适用于字典
df_dict1, df_dict2 = zip(*{key: somefunction(df) for (key, df) in df_dict.items()})
#Does not work either
两者都return
too many values to unpack (expected 2)
你的字典理解不对。我认为您正在尝试执行以下操作:
def somefunction(df):
#Does something
df1 = df.apply(lambda x: x*2)
df2 = df.apply(lambda x: x*4)
return [df1, df2]
processed_dicts = [list(zip([key]*2, somefunction(df))) for (key, df) in df_dict.items()]
df_dict1 = dict([x[0] for x in processed_dicts])
df_dict2 = dict([x[1] for x in processed_dicts])
您不能压缩字典,但您可以压缩它们的项目并从项目列表中构建字典。在这里你可以做:
[dict(t) for t in zip(*(tuple((key,v) for v in somefunction(val))
for key,val in df_dict.items()))]