我正在尝试将多列堆叠为两列。我当前的数据帧以以下方式显示,带有时间戳和其他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
如果能获得帮助,我将非常感谢。
答案 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
)