将行转换为熊猫数据帧中的列

时间:2019-08-08 14:40:34

标签: python pandas dataframe

我正在尝试将多列堆叠为两列。我当前的数据帧以以下方式显示,带有时间戳和其他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

如果能获得帮助,我将非常感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

import collections

orderedDict = collections.OrderedDict()
orderedDict['name'] = 'stackoverflow'
orderedDict['email'] = 'atack@xxx.com'
orderedDict['zip'] = '628888'

print(orderedDict)

(PS:如果您真的想按时间排序,则可以在concat的末尾添加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