【问题标题】:transforming rows to column in pandas dataframe将熊猫数据框中的行转换为列
【发布时间】:2019-12-16 07:36:40
【问题描述】:

我正在尝试将多列堆叠成两列。我当前的数据框以时间戳和其他 4 列的方式如下所示。 我现在想将 DIL 和 VOL 列堆叠在 DRUG 和 VAL 列中。

当前数据框:

     TIME           DRUG     VAL      DIL     VOL          
2018-04-26 14:00:00   A      0.22     D5W     0.1
2018-04-26 19:00:00   B      0.38     D10W    0.22
2018-04-27 16:00:00   C      0.67     D5W     0.26
2018-05-02 16:00:00   A      0.22     N10W    0.1

预期的数据框:

     TIME           DRUG/DIL     VAL/VOL          
2018-04-26 14:00:00   A           0.22     
2018-04-26 14:00:00  D5W          0.1
2018-04-26 19:00:00   B           0.38     
2018-04-26 19:00:00  D10W         0.22
2018-04-27 16:00:00   C           0.67    
2018-04-27 16:00:00  D5W          0.26
2018-05-02 16:00:00   A           0.22     
2018-05-02 16:00:00  N10W         0.1

我通过使用以下链接作为参考尝试了解决方案,但我无法实现我想要实现的目标。我很确定我错过了一个小点并且很愚蠢,我无法弄清楚。

Pandas DataFrame stack multiple column values into single column

如果我能得到一些帮助,我将不胜感激。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用 DataFrame melt 方法进行检查。

    s=df.melt(['TIME','VAL','VOL'])
    s['VAL/VOL']=np.where(s.variable=='DRUG',s.VAL,s.VOL)
    s
    Out[188]: 
           TIME   VAL   VOL variable value  VAL/VOL
    0  14:00:00  0.22  0.10     DRUG     A     0.22
    1  19:00:00  0.38  0.22     DRUG     B     0.38
    2  16:00:00  0.67  0.26     DRUG     C     0.67
    3  16:00:00  0.22  0.10     DRUG     A     0.22
    4  14:00:00  0.22  0.10      DIL   D5W     0.10
    5  19:00:00  0.38  0.22      DIL  D10W     0.22
    6  16:00:00  0.67  0.26      DIL   D5W     0.26
    7  16:00:00  0.22  0.10      DIL  N10W     0.10
    

    【讨论】:

    • 以上代码适用于 val, vol 列,但我仍然在 2 个不同的列中获取药物和稀释剂,但不是在一个列中。
    【解决方案2】:

    尝试将其拆分为 2 个数据框,更改列名并将它们连接起来。它看起来像这样:

    In [1]:
    # Setting the exemple dataset
    import pandas as pd
    
    columns = ['TIME', 'DRUG', 'VAL', 'DIL', 'VOL']          
    data = [['2018-04-26 14:00:00', 'A', 0.22, 'D5W', 0.1],
    ['2018-04-26 19:00:00', 'B', 0.38, 'D10W', 0.22],
    ['2018-04-27 16:00:00', 'C', 0.67, 'D5W', 0.26],
    ['2018-05-02 16:00:00', 'A', 0.22, 'N10W', 0.1]]
    
    df = pd.DataFrame(data, columns=columns)
    
    # Create what you want
    
    df_drug = df[['TIME', 'DRUG', 'VAL']].rename(columns={'DRUG':'DRUG/DIL', 'VAL':'VAL/VOL'})
    df_dil = df[['TIME', 'DIL', 'VOL']].rename(columns={'DIL':'DRUG/DIL', 'VOL':'VAL/VOL'})
    df_final = pd.concat([df_drug, df_dil])
    df_final
    
    Out [1]:
                TIME            DRUG/DIL    VAL/VOL
    0   2018-04-26 14:00:00        A         0.22
    1   2018-04-26 19:00:00        B         0.38
    2   2018-04-27 16:00:00        C         0.67
    3   2018-05-02 16:00:00        A         0.22
    0   2018-04-26 14:00:00       D5W        0.10
    1   2018-04-26 19:00:00       D10W       0.22
    2   2018-04-27 16:00:00       D5W        0.26
    3   2018-05-02 16:00:00       N10W       0.10
    

    (PS:如果真的要按时间排序,可以在concat末尾加.sort_values(by='TIME')

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2017-06-22
      • 1970-01-01
      • 2019-01-08
      • 2019-10-12
      • 2019-07-14
      • 2016-01-19
      • 2017-08-26
      相关资源
      最近更新 更多