首页 > 解决方案 > 在 Pandas 中通过修改复制一行

问题描述

我有一个如下的数据框:

df = pd.DataFrame({'ID': [1,1,2,2,2,3], 'year': [2017, 2018, 2017, 2018, 2019, 2018], 'count': [1,2,2,3,4,1]})

我想复制 ID,使每个 ID 都与 2017、2018 和 2019 年相关联。这里是我期待的输出:

df_i_want =  pd.DataFrame({'ID': [1,1,1,2,2,2,3,3,3], 'year': [2017, 2018, 2019, 2017, 2018, 2019, 2017, 2018,2019], 'count': [1,2,np.nan,2,3,4,np.nan,1,np.nan]}) 

你有解决方案吗?提前谢谢。

标签: pythonpandas

解决方案


用于所有Series.unstackDataFrame.stack组合:

df1 = (df.set_index(['ID','year'])['count']
          .unstack()
          .stack(dropna=False)
          .reset_index(name='count'))

DataFrame.reindexMultiIndex.from_product

#if want specify years by list
mux = pd.MultiIndex.from_product([df['ID'].unique(), [2017, 2018, 2019]], names=['ID','year'])
#if want all unique years
mux = pd.MultiIndex.from_product([df['ID'].unique(),df['year'].unique()], 
df1 = df.set_index(['ID','year']).reindex(mux).reset_index()
print (df1)

   ID  year  count
0   1  2017    1.0
1   1  2018    2.0
2   1  2019    NaN
3   2  2017    2.0
4   2  2018    3.0
5   2  2019    4.0
6   3  2017    NaN
7   3  2018    1.0
8   3  2019    NaN

推荐阅读