Python 熊猫。康卡特生产所有的熊猫
我试图用Python 熊猫。康卡特生产所有的熊猫,python,numpy,pandas,Python,Numpy,Pandas,我试图用pd.concat([a,b],axis=1)连接两个系列,但结果是一个数据帧中填充了NaNs,我的意思是: 制作两个系列 by_status=odr.set_索引('order_status')) g=按状态分组(['dt','product\u id']) 已付款订单=g.尺寸() payed_orders.name='payed_orders' 退款=按状态。loc[[1,2,3],:].groupby(['dt','product\u id']) 退款订单=退款大小() 退款订单
pd.concat([a,b],axis=1)
连接两个系列,但结果是一个数据帧中填充了NaN
s,我的意思是:
制作两个系列
by_status=odr.set_索引('order_status'))
g=按状态分组(['dt','product\u id'])
已付款订单=g.尺寸()
payed_orders.name='payed_orders'
退款=按状态。loc[[1,2,3],:].groupby(['dt','product\u id'])
退款订单=退款大小()
退款订单。名称='退款订单'
#我要处理退款单和付款单
>>已付款订单头()
dt产品标识
2015-01-15 10001 1
10007 1
10016 14
10022 1
10023 1
名称:已付款订单,数据类型:int64
>>>退还订单。头()
dt产品标识
2015-01-15 10007 1
10016 4
10030 1
2015-01-16 10007 3
10008 1
名称:退款单,数据类型:int64
>>>pd.concat([payed_orders.head(),return_orders.head()],axis=1,ignore_index=False)
已付款订单退款订单
dt产品标识
2015-01-15 10001楠楠楠
10007南南
10016楠楠
10022楠楠
10023楠楠
10030楠楠
2015-01-16 10007楠楠
10008楠楠
我不认为我一定犯了一些明显的错误,但我真的想不出来,请帮忙
另外,代码是从ipython笔记本上复制的,不要对格式感到奇怪
更新
尝试传递ignore\u index=True
,下面是发生的情况:
pd.concat([payed_orders.tail(),return_orders.tail()],axis=1,ignore_index=True)
0 1
dt产品标识
2015-09-07 1000081楠楠
1000084南南
1000094南南
1000096楠楠
1000124楠楠
1000131楠楠
1000132南南
1000133楠楠
1000134南南
1000137楠楠
至于索引格式问题
这里有两个系列不能很好地结合在一起:
>a4.head()到
{'actual_suborders':{(datetime.date(2015,1,15),10001):1,
(日期时间日期(2015年1月15日)10016:10,
(日期时间日期(2015年1月15日),10022):1,
(日期时间日期(2015年1月15日),10023):1,
(datetime.date(2015,1,15),10024):1}
>>>a5.头()至第()条
{'u suborders':{(datetime.date(2015,1,15),10007):1,
(日期时间日期(2015年1月15日),10016):4,
(日期时间日期(2015年1月15日),10030):1,
(日期时间日期(2015年1月16日),10007):4,
(datetime.date(2015,1,16),10008):1}
>>>pd.concat([a4.head(),a5.head()],轴=1)
实际子订单退款子订单
dt产品标识
2015-01-15 10001楠楠楠
10007南南
10016楠楠
10022楠楠
10023楠楠
10024楠楠
10030楠楠
2015-01-16 10007楠楠
10008楠楠
终极手段
感谢所有决定关注这个伟大社区的人
我已将上述系列的标题序列化,并上传到evernote,其中包含要加载和解析的代码
为了使这一点起作用,我必须从每个系列的旧索引的串联中创建唯一的值。然后,在连接时,我将其作为参数传递给
join\u axes
:
import datetime
import pandas as pd
s1 = pd.Series([1, 10, 1, 1, 1],
name='actual_suborders',
index=[(dt.date(2015, 1, 15), 10001),
(dt.date(2015, 1, 15), 10016),
(dt.date(2015, 1, 15), 10022),
(dt.date(2015, 1, 15), 10023),
(dt.date(2015, 1, 15), 10024)])
s2 = pd.Series([1, 4, 1, 4, 1],
name='refund_suborders',
index=[(dt.date(2015, 1, 15), 10007),
(dt.date(2015, 1, 15), 10016),
(dt.date(2015, 1, 15), 10030),
(dt.date(2015, 1, 16), 10007),
(dt.date(2015, 1, 16), 10008)])
idx = set(pd.concat([s1.reset_index()['index'],
s2.reset_index()['index']],
ignore_index=True))
>>> pd.concat([s1, s2], axis=1, join_axes=[idx])
actual_suborders refund_suborders
(2015-01-15, 10022) 1 NaN
(2015-01-15, 10001) 1 NaN
(2015-01-15, 10023) 1 NaN
(2015-01-16, 10008) NaN 1
(2015-01-15, 10030) NaN 1
(2015-01-15, 10016) 10 4
(2015-01-15, 10007) NaN 1
(2015-01-16, 10007) NaN 4
(2015-01-15, 10024) 1 NaN
此外,您的索引似乎在某个地方发生了更改。您的by_status.groupby(['dt','product_id'])
操作应该会产生一个多索引,但是上面粘贴的a4.head()
和a5.head()
的结果表明它在行的某个位置更改为元组对。我怀疑这可能是最终的问题
编辑
我不明白为什么concat
不起作用,但我使用merge
实现了您的目标
首先,重置索引。然后合并dt
和product\u id
上的数据帧:
a4.reset_index(inplace=True)
a5.reset_index(inplace=True)
>>> a4.merge(a5, on=['dt', 'product_id'], how='outer')
dt product_id actual_suborders refund_suborders
0 2015-01-15 10001 1 NaN
1 2015-01-15 10016 10 4
2 2015-01-15 10022 1 NaN
3 2015-01-15 10023 1 NaN
4 2015-01-15 10024 1 NaN
5 2015-01-15 10007 NaN 1
6 2015-01-15 10030 NaN 1
7 2015-01-16 10007 NaN 4
8 2015-01-16 10008 NaN 1
大概是因为您的多索引没有公共索引值,当您传递
忽略\u index=True
时会发生什么?在哪里定义了付款\u子订单退款\u订单,它们似乎不是列标题?他们似乎都不是DF的一部分?所以你得到的是NaN,因为它们不存在任何值…@EdChum没有任何好处,我更新了我的帖子,表明这两个系列的索引确实有共同的索引values@dartdog它们是从groupby对象计算出来的,按['dt','product\u id']
分组,这与这种情况有关吗?我认为这可能是问题所在,请尝试将group by的结果分配给新的DFs。。groupby操作应该并且确实会产生一个多索引,当我使用系列将pandas系列转换为dict时。为了_dict()
,基础多索引只是转换为元组,并不是说索引本身是一个元组数组,我文章中的代码就是我用来生成这些系列对象的代码,正如你所看到的,它不包含任何中间步骤,我将发布原始序列化数据,即使它是格式错误的多索引,concat操作也不应该产生一个全NaN帧,对吗?它至少应该包含一些东西,所有的数字都到哪里去了?我注意到,pd.merge
也很有效,但我正在尝试连接5到7个类似的熊猫系列,我已经分析了,了解到一次合并两个对我的需要来说太昂贵了。为什么不打开一张新的票“可能的错误:熊猫浓缩多索引”. 提及您正在使用的Pandas和Python版本,并包括示例数据。