为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas:将 DataFrame 解压为 Series 会导致 NaN

Pandas:将 DataFrame 解压为 Series 会导致 NaN

慕虎7371278 2021-07-30 01:13:37
我有以下数据框并想将它拆开,生成一个系列x和一个系列y,time作为索引和value数据:   var  time  value0    x     0     111    y     0    1232    x     1     123    y     1    1244    x     2     135    y     2    125这是我的代码:import pandas as pddf = 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)这是输出:time0    11.01     NaN2    12.0Name: x, dtype: float64time0      NaN1    123.02      NaNName: y, dtype: float64但我希望这个系列是time0    11.01    12.0 2    13.0Name: x, dtype: float64time0    123.01    124.02    125.0Name: y, dtype: float64显然熊猫没有将time-axis 正确对齐到value-axis。根据我的理解,每个.loc应该只返回相应的 3 个元素并将它们组合在一起作为新构建的系列的索引和数据。为什么这不发生?获得我想要的结果的最简单方法是什么?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

有更好的方法来实现这一点。如果你想知道你的代码有什么问题,你将一个系列作为数据和索引传递,而是传递一个数组。


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


查看完整回答
反对 回复 2021-08-03
?
繁星coding

TA贡献1797条经验 获得超4个赞

这是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']


查看完整回答
反对 回复 2021-08-03
?
烙印99

TA贡献1829条经验 获得超13个赞

我不知道为什么把一个系列作为你的数据会给你这个结果,但我可以回答你的第二个问题


获得我想要的结果的最简单方法是什么?

您可以将数据转换为列表以获得所需的结果。


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']。


查看完整回答
反对 回复 2021-08-03
  • 3 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信