【问题标题】:How to make each row in dataframe have one value for each column?如何使数据框中的每一行的每一列都有一个值?
【发布时间】:2017-05-20 01:07:25
【问题描述】:

我有以下数据框,其中包含 ID_xID_y 列,其中包含用单个空格分隔的数据:

df = pd.DataFrame({
    'fruit':['apple','orange','banana'],
    'ID_x' : ['1 2 3','4','5'],  
    'ID_y' : ['A B', 'C D','E']
    }, index=['0','1','2'])

我想拆分列(ID_xID_y)中的每个值并创建新行,以便每一行代表拆分值的一一对应关系。

类似这样的:

知道如何解决这个问题吗?

到目前为止我已经尝试过拆分列中的值:

col_x = 'ID_x'
col_y = 'ID_y'

df = df_unflat.assign(**{col_x:df_unflat[col_x].str.split(' ')})
df = df_unflat.assign(**{col_y:df_unflat[col_y].str.split(' ')})

【问题讨论】:

    标签: python pandas numpy dataframe split


    【解决方案1】:

    试试这个方法:

    import pandas as pd
    df = pd.DataFrame({
        'fruit':['apple','orange','banana'],
        'ID_x' : ['1 2 3','4','5'],  
        'ID_y' : ['A B', 'C D','E']
        }, index=['0','1','2'])
    id_x = df['ID_x'].str.split(' ').apply(Series, 1).stack()
    id_y = df['ID_y'].str.split(' ').apply(Series, 1).stack()
    id_x.index = id_x.index.droplevel(-1)
    id_y.index = id_y.index.droplevel(-1)
    id_x.name = 'ID_x'
    id_y.name = 'ID_y'
    del df['ID_x']
    del df['ID_y']
    df = df.join(id_x)
    df = df.join(id_y)
    df.reset_index(drop=True)
    

    输出:

        fruit   ID_x    ID_y
    0   apple   1       A
    1   apple   1       B
    2   apple   2       A
    3   apple   2       B
    4   apple   3       A
    5   apple   3       B
    6   orange  4       C
    7   orange  4       D
    8   banana  5       E
    

    【讨论】:

      【解决方案2】:
      import itertools
      #convert DF values to a numpy array, get all combinations between ID_x, ID_y and fruit, finally reconstruct the Dataframe.    
      pd.DataFrame(sum([list(itertools.product(e[0].split(),e[1].split(),[e[2]])) for e in df.values],[]), columns=df.columns)
      Out[483]: 
        ID_x ID_y   fruit
      0    1    A   apple
      1    1    B   apple
      2    2    A   apple
      3    2    B   apple
      4    3    A   apple
      5    3    B   apple
      6    4    C  orange
      7    4    D  orange
      8    5    E  banana
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 2020-03-02
        • 2016-12-22
        相关资源
        最近更新 更多