【问题标题】:join table horizontally by loop based on rows in a dataframe基于数据框中的行通过循环水平连接表
【发布时间】:2020-10-08 07:06:59
【问题描述】:

我有一个数据框 data_dfn 行:

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

我希望这是有道理的..

【问题讨论】:

    标签: python pandas dataframe join


    【解决方案1】:

    DataFrame.stack 用于SeriesMultiIndex,通过Series.to_frame 转换为一行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  
    

    【讨论】:

    • 还有什么方法可以避免 lambda?
    • @cna - 当然,添加了另一个解决方案
    • 嘿,想知道如何即兴使用此代码来解压包含字典的列。我可以举个例子..
    • @cna - 好的,超级,等待示例
    • 好的,dropna() 解决了这个问题。非常非常非常感谢:)
    【解决方案2】:

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

    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']
    

    【讨论】:

    • 这样更直观。谢谢!
    • 我认为 pandas 中的循环是反模式,所以你可以避免它。检查this
    • @jezrael:谢谢你的提示。我知道这不是 pythonic(pandastic),对我来说它更容易理解 - 不过很高兴知道 - 如果需要性能。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多