pandas 使用重复列名重塑数据框架

zed5wv10  于 2023-06-04  发布在  其他
关注(0)|答案(3)|浏览(388)

我有这样的数据:

dataframe_1:                
    week    SITE        LAL SITE     LAL
0   1   BARTON CHAPEL   1.1 PENASCAL I  1
1   2   BARTON CHAPEL   1.1 PENASCAL I  1
2   3   BARTON CHAPEL   1.1 PENASCAL I  1

最后的dataframe看起来像这样:

dataframe_2:        
    week    SITE    LAL
0   1   BARTON CHAPEL   1.1
1   2   BARTON CHAPEL   1.1
2   3   BARTON CHAPEL   1.1
3   1   PENASCAL I  1
4   2   PENASCAL I  1
5   3   PENASCAL I  1

我试过使用“融化”,但我不能得到想要的结果。也许我用错了方法?谢谢你,

ttygqcqt

ttygqcqt1#

如果你有明确的列名:

week           SITE  LAL      SITE.1  LAL.1
0     1  BARTON CHAPEL  1.1  PENASCAL I      1
1     2  BARTON CHAPEL  1.1  PENASCAL I      1
2     3  BARTON CHAPEL  1.1  PENASCAL I      1

可以使用pandas.lreshape

pd.lreshape(df, {'SITE': ['SITE', 'SITE.1'], 'LAL': ['LAL', 'LAL.1']})

输出:

week           SITE  LAL
0     1  BARTON CHAPEL  1.1
1     2  BARTON CHAPEL  1.1
2     3  BARTON CHAPEL  1.1
3     1     PENASCAL I  1.0
4     2     PENASCAL I  1.0
5     3     PENASCAL I  1.0

对于重复的列,可以使用melt + pivot

out = (df
   .melt('week').assign(idx=lambda d: d.groupby(['week', 'variable']).cumcount())
   .pivot(index=['idx', 'week'], columns='variable', values='value')
   .reset_index('week').rename_axis(index=None, columns=None)
)

输出:

week  LAL           SITE
0     1  1.1  BARTON CHAPEL
0     2  1.1  BARTON CHAPEL
0     3  1.1  BARTON CHAPEL
1     1    1     PENASCAL I
1     2    1     PENASCAL I
1     3    1     PENASCAL I
carvr3hs

carvr3hs2#

这不是一个非常通用的解决方案,但将适用于您的示例:

df.groupby('week').apply( lambda _df : pd.concat((_df.iloc[:,1:3], _df.iloc[:,3:5]))).reset_index('week')

它按周分组,然后用列选择+连接重新整形。最后删除一个多余的索引列。

70gysomp

70gysomp3#

您可以通过从dataframe_1中提取您想要提取并在底部连接的列来完成此操作:

# create a dummy dataframe with 6 columns and 10 rows
df = pd.DataFrame(np.random.randint(0,100,size=(10, 6)), columns=list('ABCDEF'))

df_tempo = df[['D','E','F']]

然后用相同的名字重命名临时 Dataframe 的列['week','SITE','LAL']:

df_tempo.columns = ['A','B','C']

然后将temporary与您要保留的第一个dataframe的子集连接起来:

df = pd.concat([df[['A','B','C']], df_tempo], axis=0, ignore_index=True)

希望能帮上忙!

相关问题