मेरे पास क्या है?

मुझे निम्नलिखित df और तिथियों की एक सूची मिली है:

df
   id  value        date
0   1      1  2020-01-01
1   1      2  2020-02-01
2   1      3  2020-03-01
3   2      3  2020-01-01
4   2      4  2020-02-01
5   2      5  2020-03-01
6   3      6  2020-01-01
7   3      7  2020-02-01
8   3      8  2020-03-01

dates = ['2020-01-01','2020-02-01','2020-03-01']

मैं क्या प्राप्त करना चाहता हूं?

मुझे अलग आईडी के साथ एक नया डीएफ चाहिए और प्रत्येक तिथि के लिए मूल्य के साथ एक नया कॉलम चाहिए:

   id  2020-01-01  2020-02-01  2020-03-01
0   1         1         2         3
1   2         4         5         6
2   3         7         8         9

मैंने क्या प्रयास किया?

for date in dates:
    df_result[date] = df.loc[df['date'] == date, 'value']

और यह मुझे क्या मिला:


   id  2020-01-01  2020-02-01  2020-03-01
0   1         1.0         NaN         NaN
1   2         NaN         2.0         NaN
2   3         NaN         NaN         3.0

जैसा कि आप देख सकते हैं कि यह गलत है, कोई समाधान?

2
Dean Taler 24 सितंबर 2020, 11:38

1 उत्तर

सबसे बढ़िया उत्तर

अगर तारीखें स्ट्रिंग हैं तो Series.isinका इस्तेमाल करें फ़िल्टर के लिए सूची के साथ boolean indexing और फिर DataFrame.pivot:

dates = ['2020-01-01','2020-02-01','2020-03-01']

df = df[df['date'].isin(dates)].pivot('id','date','value')
print (df)
date  2020-01-01  2020-02-01  2020-03-01
id                                      
1              1           2           3
2              3           4           5
3              6           7           8

अंतिम बार id को कॉलम में बदलें:

df = df.reset_index().rename_axis(None, axis=1)
print (df)
   id  2020-01-01  2020-02-01  2020-03-01
0   1           1           2           3
1   2           3           4           5
2   3           6           7           8

डेटाटाइम्स के साथ समाधान - सूची को परिवर्तित करना भी आवश्यक है:

df['date'] = pd.to_datetime(df['date'])

dates = ['2020-01-01','2020-02-01','2020-03-01']

df = df[df['date'].isin(pd.to_datetime(dates))].pivot('id','date','value')
print (df)
date  2020-01-01  2020-02-01  2020-03-01
id                                      
1              1           2           3
2              3           4           5
3              6           7           8

अंतिम बार id को कॉलम में बदलें, इसमें छिपे हुए समय जोड़े गए हैं:

df = df.reset_index().rename_axis(None, axis=1)
print (df)
   id  2020-01-01 00:00:00  2020-02-01 00:00:00  2020-03-01 00:00:00
0   1                    1                    2                    3
1   2                    3                    4                    5
2   3                    6                    7                    8

उन्हें हटाने के लिए डेटाटाइम्स को स्ट्रिंग्स में बदलना संभव है:

df = (df.rename(columns = lambda x: x.strftime('%Y-%m-%d'))
        .reset_index()
        .rename_axis(None, axis=1))
print (df)
   id  2020-01-01  2020-02-01  2020-03-01
0   1           1           2           3
1   2           3           4           5
2   3           6           7           8
2
jezrael 24 सितंबर 2020, 11:47