Понимание словаря для создания новых столбцов в сохраненных фреймах данных - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть словарь со значениями Pandas DataFrames. Я хотел бы создать новые столбцы в каждом из DataFrames. Я мог бы легко использовать цикл for, но я бы хотел более питонический способ сделать это. Понимание словаря кажется идеальным способом сделать это. Как это можно сделать, используя словарь?

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)

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете попробовать с concat с keys

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

Get 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
0 голосов
/ 06 сентября 2018

Вы можете создать небольшую вспомогательную функцию, которая вызывается в словаре:

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 не будет изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...