【问题标题】:Create columns of a pandas dataframe from other columns containing data in text format从包含文本格式数据的其他列创建熊猫数据框的列
【发布时间】:2020-03-22 18:02:43
【问题描述】:

我有以下数据框

data= {
    'a_index':[55, 72, 112, 55, 53, 100, 89],
    'make':['TY', 'FD', 'TA', 'HA', 'MA', 'BW', 'VN'],
    'p_index':[120, 70, 120, 128, 180, 172, 150],
    'score':['2.3,1.3,3.2,3.4','2.7,4.3, 4.2,3.4','2.3,4.3, 4.2,,3.4', '2.3,4.3, 4.2,3.4', '1.3,5.3, 7.2,3.4', '2.3,4.3, 4.2,3.4', '2.3,4.3,4.2,3.4'],
}
df = pd.DataFrame(data,
                  index=['NK', 'JN', 'NA', 'PP', 'DK', 'HA', 'CK'])
df

这给了我

    a_index make  p_index   score
NK  55      TY     120      2.3,1.3,3,2,3.4
JN  72      FD     70       2.7,4.3, 4,2,3.4
NA  112     TA     120      2.3,4.3, 4,2,,3.4
PP  55      HA     128      2.3,4.3, 4,2,3.4
DK  53      MA     180      1.3,5.3, 7,2,3.4
HA  100     BW     172      2.3,4.3, 4,2,3.4
CK  89      VN     150      2.3,4.3,4,2,3.4

从这个数据帧到以下数据帧的最简单方法是什么

    a_index make    p_index score             sore_1    sore_2  sore_3  sore_4
NK   55     TY      120      2.3,1.3,3,2,3.4    2.3     1.3     3.2      3.4
JN   72     FD      70       2.7,4.3, 4,2,3.4   2.7     4.3     4.2      3.4
NA   112    TA      120      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
PP   55     HA      128      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
DK   53     MA      180      1.3,5.3, 7,2,3.4   1.3     5.3     7.2      3.4
HA   100    BW      172      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
CK   89     VN      150      2.3,4.3,4.2,3.4    2.3     4.3     4.2      3.4

【问题讨论】:

  • 而不是2.3,4.3, 4,2,,3.4 应该是2.3,4.3, 4,2, 3.4
  • 是的,没错。已更正。
  • @kederrac,Ukrainian-serge 和 Samira Kumar 感谢您抽出宝贵时间回答我的问题。欣赏它。这三个都适用于最新的 pandas 版本。我对所有三个答案都投了赞成票,但只能接受一个答案。

标签: python pandas python-2.7


【解决方案1】:

你可以使用:

pd.concat(
    [
        df, 
        df['score'].str.split(',', expand=True).rename(
            lambda x: f'score_{x}',axis='columns')
    ], axis=1)

【讨论】:

  • 你可以用 ... add_prefix('score_') 替换重命名部分
  • 但是使用重命名和 axis=columns 更具可读性有很多方法可以做到,我想这是主观的
  • 太棒了。这与最新版本的熊猫完美配合。我喜欢你的解决方案。但是我们如何在 pandas 0.17 中编写相同的功能呢?这是我在 prod 中使用的 pd 版本。
  • @Ayalew thx,但正如我所说,这是另一个问题的任务
【解决方案2】:

你可以试试这个。

df['score'].str.split(',').apply(pd.Series).rename(columns = {0:'score_1',1:'score_2',2:'score_3',3:'score_4'})

    score_1 score_2 score_3 score_4
NK  2.3 1.3 3.2 3.4
JN  2.7 4.3 4.2 3.4
NA  2.3 4.3 4.2 3.4
PP  2.3 4.3 4.2 3.4
DK  1.3 5.3 7.2 3.4
HA  2.3 4.3 4.2 3.4
CK  2.3 4.3 4.2 3.4

然后将其合并回原始数据框。

【讨论】:

    【解决方案3】:

    试试:

    exploded = df.score.apply(lambda x: pd.Series(x.split(',')))       # use explode
    
    exploded.columns = ['score_'+str(col) for col in exploded.columns] # rename columns
    
    pd.concat([df, exploded], axis=1)                                  # concat to original df
    
    print(df)
    
        a_index make  p_index             score score_0 score_1 score_2 score_3 score_4
    NK       55   TY      120   2.3,1.3,3,2,3.4     2.3     1.3       3       2     3.4
    JN       72   FD       70  2.7,4.3, 4,2,3.4     2.7     4.3       4       2     3.4
    NA      112   TA      120  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
    PP       55   HA      128  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
    DK       53   MA      180  1.3,5.3, 7,2,3.4     1.3     5.3       7       2     3.4
    HA      100   BW      172  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
    CK       89   VN      150   2.3,4.3,4,2,3.4     2.3     4.3       4       2     3.4
    

    【讨论】:

    • 这很棒。你知道如何对 pandas 0.17 做同样的事情吗
    • 对不起,我没有看到你的 Python 版本。当我有时间时,我会创建一个 Python 2.7 env 并发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多