我有以下数据框,并希望将其拆开,以x
作为索引,以y
作为数据,生成一系列time
和一系列value
:< / p>
var time value
0 x 0 11
1 y 0 123
2 x 1 12
3 y 1 124
4 x 2 13
5 y 2 125
这是我的代码:
import pandas as pd
df = pd.DataFrame({
'time': [0,0,1,1,2,2],
'var': list('xyxyxy'),
'value': [11,123,12,124,13,125]})
for col in ['x', 'y']:
s = pd.Series(
data=df.loc[df['var'] == col, 'value'],
index=df.loc[df['var'] == col, 'time'],
name=col)
print(s)
这是输出:
time
0 11.0
1 NaN
2 12.0
Name: x, dtype: float64
time
0 NaN
1 123.0
2 NaN
Name: y, dtype: float64
但是我希望系列会
time
0 11.0
1 12.0
2 13.0
Name: x, dtype: float64
time
0 123.0
1 124.0
2 125.0
Name: y, dtype: float64
很显然,熊猫无法将time
轴与value
轴正确对齐。据我了解,每个.loc
应该只返回相应的3个元素,并将它们组装为新构建的序列的索引和数据。
答案 0 :(得分:2)
这是pivot
问题
s=df.pivot(*df.columns)
s
Out[56]:
time 0 1 2
var
x 11 12 13
y 123 124 125
#s['y'],s['x']
答案 1 :(得分:1)
@Wen指出,有更好的方法可以实现这一目标。如果您想知道代码有什么问题,可以将一系列作为数据和索引传递,而应传递一个数组。
for v in df['var'].unique():
s = pd.Series(
data=df.loc[df['var'] == v, 'value'].values,
index=df.loc[df['var'] == v, 'time'].values,
name=col)
print(s)
0 11
1 12
2 13
Name: y, dtype: int64
0 123
1 124
2 125
Name: y, dtype: int64
答案 2 :(得分:0)
我不确定为什么将系列作为您的数据能给您带来结果,但是我可以回答您的第二个问题
您可以将数据转换为列表,以获得所需的结果。
for col in ['x', 'y']:
s = pd.Series(
data=df.loc[df['var'] == col, 'value'].tolist(),
index=df.loc[df['var'] == col, 'time'],
name=col)
print(s)
输出:
time
0 11
1 12
2 13
Name: x, dtype: int64
time
0 123
1 124
2 125
Name: y, dtype: int64
这是与@Wen提交的答案类似的另一种方式(并且更优雅):
df_new = pd.pivot_table(data=df, columns='var', index='time', values='value')
输出:
var x y
time
0 11 123
1 12 124
2 13 125
然后您可以呼叫df_new['x']
或df_new['y']
。