基于数据帧中的行通过循环水平连接表

2024-09-30 02:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧data_df,其中有n行:

Rank       DutyCode
200        ABC
300        DEF
400        GHI

然后,我想迭代地将它们合并为一行,例如:

Rank       DutyCode  Rank_1      DutyCode_1    Rank_2       DutyCode_2 
200        ABC        300        DEF           400        GHI

我当前的代码:

column_data_df = data_df.iloc[[1]]
data_df.iloc = data_df.iloc.drop([0])

data_df = data_df.join(column_data_df, rsuffix='_1')

并且只生产:

Rank       DutyCode  Rank_1      DutyCode_1    
200        ABC        300        DEF        

这只适用于一次。。我希望它对n行数是动态的

编辑

另一个数据帧:

       Rank             DutyCode
{'a':'b', 'i':'j'}        ABC
{'a':'b', 'i':'j'}        DEF
{'a':'b', 'i':'j'}        GHI

致:

Rank.a  Rank.i  DutyCode  Rank_1.a  Rank_1.i   DutyCode_1
   b       j       ABC       b        j           DEF

我希望这是有道理的


Tags: 数据代码dfdatadef动态columndrop
2条回答

使用^{}表示SeriesMultiIndex,通过^{}转换为一行DataFrame,并转置和最后展平MultiIndex

df = df.stack().to_frame().T
df.columns = df.columns.map(lambda x: f'{x[1]}_{x[0]}').str.replace('_0','')
print (df)
  Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0  200      ABC    300        DEF    400        GHI

或用于扁平化使用列表理解:

df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]

print (df)
  Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0  200      ABC    300        DEF    400        GHI

编辑:

import ast

#if necessary
#df['Rank'] = df['Rank'].apply(ast.literal_eval)

df = pd.json_normalize(df.pop('Rank')).add_prefix('Rank.').join(df)
print (df)
  Rank.a Rank.i DutyCode
0      b      j      ABC
1      b      j      DEF
2      b      j      GHI

df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]

print (df)
  Rank.a Rank.i DutyCode Rank.a_1 Rank.i_1 DutyCode_1 Rank.a_2 Rank.i_2  \
0      b      j      ABC        b        j        DEF        b        j   

  DutyCode_2  
0        GHI  

这不是最干净的方法,但它是有效的:

import pandas as pd
input = pd.DataFrame(data=[[200, 'ABC'], [300, 'DEF'],[400, 'GHI']],\
             columns=['Rank' ,'DutyCode'])

df = input.iloc[0]
for row in range(1,len(df)+1):
    df['Rank_' +str(row)] = input.loc[row]['Rank']
    df['DutyCode_' +str(row)] = input.loc[row]['DutyCode']

相关问题 更多 >

    热门问题