Python 字典理解在存储的数据帧中创建新列
我有一个字典,里面的值是数据帧。我想在每个数据帧中创建新列。我可以很容易地使用for循环,但我希望使用一种更具python风格的方法。词典理解似乎是一种理想的方法。使用字典理解如何做到这一点Python 字典理解在存储的数据帧中创建新列,python,pandas,for-loop,dataframe,dictionary-comprehension,Python,Pandas,For Loop,Dataframe,Dictionary Comprehension,我有一个字典,里面的值是数据帧。我想在每个数据帧中创建新列。我可以很容易地使用for循环,但我希望使用一种更具python风格的方法。词典理解似乎是一种理想的方法。使用字典理解如何做到这一点 df1 = pd.DataFrame(data =[['2013',98],['2014',100],['2015',110], ['2016',110],['2017',115]], columns = ['Year
df1 = pd.DataFrame(data =[['2013',98],['2014',100],['2015',110],
['2016',110],['2017',115]],
columns = ['Year','Value'])
df2 = pd.DataFrame(data =[['2013',85],['2014',90],['2015',95],
['2016',97],['2017',99]],
columns = ['Year','Value'])
df3 = pd.DataFrame(data =[['2013',30],['2014',28],['2015',25],
['2016',28],['2017',32]],
columns = ['Year','Value'])
d1 = {}
d1['df1'] = df1
d1['df2'] = df2
d1['df3'] = df3
for k in d1.keys():
d1[k]['shifted'] = d1[k]['Value'].shift(2)
您可以创建一个在字典理解中调用的小助手函数:
def add_shifted_col(df):
df['shifted'] = df['Value'].shift(2)
return df
{k: add_shifted_col(v) for k, v in d1.items()}
编辑:词典理解创建一个新词典。要使用此更新原始文件,您可以调用:
d1.update({k: add_shifted_col(v) for k, v in d1.items()})
若您只想有条件地向数据帧的选择中添加额外的序列,例如
update_these = ['df2', 'df3']
d1.update({k: add_shifted_col(v) for k, v in d1.items() if k in update_these})
在本例中,将向df2和df3添加一个额外的系列,但不会更改df1。您可以创建一个在字典理解中调用的小辅助函数:
def add_shifted_col(df):
df['shifted'] = df['Value'].shift(2)
return df
{k: add_shifted_col(v) for k, v in d1.items()}
编辑:词典理解创建一个新词典。要使用此更新原始文件,您可以调用:
d1.update({k: add_shifted_col(v) for k, v in d1.items()})
若您只想有条件地向数据帧的选择中添加额外的序列,例如
update_these = ['df2', 'df3']
d1.update({k: add_shifted_col(v) for k, v in d1.items() if k in update_these})
在此示例中,将向df2和df3添加一个额外的系列,但不会更改df1。您可以使用
键尝试concat
l=[df1,df2,df3]
newdf=pd.concat(l,keys=['df1','df2','df3'])
newdf['shifted']=newdf.groupby(level=0).Value.shift(2)
newdf
Out[437]:
Year Value shifted
df1 0 2013 98 NaN
1 2014 100 NaN
2 2015 110 98.0
3 2016 110 100.0
4 2017 115 110.0
df2 0 2013 85 NaN
1 2014 90 NaN
2 2015 95 85.0
3 2016 97 90.0
4 2017 99 95.0
df3 0 2013 30 NaN
1 2014 28 NaN
2 2015 25 30.0
3 2016 28 28.0
4 2017 32 25.0
获取df1
newdf.loc['df1']
Out[438]:
Year Value shifted
0 2013 98 NaN
1 2014 100 NaN
2 2015 110 98.0
3 2016 110 100.0
4 2017 115 110.0
您可以尝试使用concat
和键
l=[df1,df2,df3]
newdf=pd.concat(l,keys=['df1','df2','df3'])
newdf['shifted']=newdf.groupby(level=0).Value.shift(2)
newdf
Out[437]:
Year Value shifted
df1 0 2013 98 NaN
1 2014 100 NaN
2 2015 110 98.0
3 2016 110 100.0
4 2017 115 110.0
df2 0 2013 85 NaN
1 2014 90 NaN
2 2015 95 85.0
3 2016 97 90.0
4 2017 99 95.0
df3 0 2013 30 NaN
1 2014 28 NaN
2 2015 25 30.0
3 2016 28 28.0
4 2017 32 25.0
获取df1
newdf.loc['df1']
Out[438]:
Year Value shifted
0 2013 98 NaN
1 2014 100 NaN
2 2015 110 98.0
3 2016 110 100.0
4 2017 115 110.0
您不需要列表/目录理解,因为您将为数据帧分配某些内容(一个新列),而无法在列表理解中进行分配。我想到的最简单的方法是使用dfs=[df1,df2,df3]
和dfs中df的简单for循环:df['shift']=df['Value']。shift(2)
您不需要列表/目录理解,因为您将为数据帧分配某些内容(一个新列),并且无法在列表理解中分配。我想到的最简单的方法是使用dfs=[df1,df2,df3]
和dfs中df的简单for循环:df['shift']=df['Value']。shift(2)
谢谢你的回答。我很欣赏有条件地选择数据帧的额外示例。我希望字典理解能允许在没有辅助函数的情况下使用函数,但是这个解决方案很好用,而且非常可读。谢谢你的回答。我很欣赏有条件地选择数据帧的额外示例。我希望字典理解能允许在没有辅助函数的情况下使用函数,但是这个解决方案很好用,而且很容易阅读。我有一个问题。提前谢谢,@YOBEN_SI有个问题。提前谢谢,@YOBEN_