Python 丢失连接数据帧的值
我不明白为什么这段代码会删除值Python 丢失连接数据帧的值,python,pandas,dataframe,Python,Pandas,Dataframe,我不明白为什么这段代码会删除值 solddf[['Name', 'Barcode', 'SalesRank', 'SoldPrices', 'SoldDates', 'SoldIds']].head() Out[3]: Name Barcode \ 62693 Near Dark [DVD] [1988] [Region 1] [US Import] ... 1.31312
solddf[['Name', 'Barcode', 'SalesRank', 'SoldPrices', 'SoldDates', 'SoldIds']].head()
Out[3]:
Name Barcode \
62693 Near Dark [DVD] [1988] [Region 1] [US Import] ... 1.313124e+10
94823 Battlefield 2 Modern Combat / Game 1.463315e+10
24965 Star Wars: The Force Unleashed (PS3) 2.327201e+10
24964 Star Wars: The Force Unleashed (PS3) 2.327201e+10
24963 Star Wars: The Force Unleashed (PS3) 2.327201e+10
SalesRank SoldPrices SoldDates SoldIds
62693 14.04 2017-08-05 07:28:56 162558627930
94823 1.49 2017-09-06 04:48:42 132301267483
24965 4.29 2017-08-23 18:44:42 302424166550
24964 5.27 2017-09-08 19:55:02 132317908530
24963 5.56 2017-09-15 08:23:24 132322978130
这是我的数据框。它将我从eBay API中获取的每一笔交易存储为一个新行
我的目标是寻找每周销售额和亚马逊销售排名之间的相关性
solddf['Week'] = solddf['SoldDates'].apply(lambda x: x.week)
weeklysales = solddf.groupby(['Barcode', 'Week']).size().unstack()
weeklysales = weeklysales.fillna(0)
weeklysales['Mean'] = weeklysales.mean(axis=1)
weeklysales.head()
Out[5]:
Week 29 30 31 32 33 34 35 36 37 38 39 40 41 \
Barcode
1.313124e+10 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1.463315e+10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
2.327201e+10 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 2.0 2.0 0.0 2.0 1.0
2.327201e+10 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0
2.327201e+10 0.0 0.0 3.0 2.0 2.0 2.0 1.0 1.0 5.0 0.0 2.0 2.0 1.0
Week 42 Mean
Barcode
1.313124e+10 0.0 0.071429
1.463315e+10 0.0 0.071429
2.327201e+10 0.0 0.642857
2.327201e+10 0.0 0.142857
2.327201e+10 0.0 1.500000
因此,我计算出了每种商品(或条形码)的每周平均销售额
然后,我想获取平均值,并将它们插入到我开始使用的solddf数据帧中
s1 = pd.Series(weeklysales.Mean, index=solddf.Barcode).reset_index()
s1 = s1.sort_values('Barcode')
s1.head()
Out[17]:
Barcode Mean
0 1.313124e+10 0.071429
1 1.463315e+10 0.071429
2 2.327201e+10 0.642857
3 2.327201e+10 0.642857
4 2.327201e+10 0.642857
这看起来不错,行数正确,应该适合
solddf = solddf.sort_values('Barcode')
solddf['WeeklySales'] = s1.Mean
这种方法似乎有效,但我遇到了一个问题,一些np.nan值现在出现了,这些值以前不在s1中
s1.Mean.isnull().sum()
Out[13]: 0
len(s1) == len(solddf)
Out[14]: True
但我传递的价值观现在是np.nan
solddf.WeeklySales.isnull().sum()
Out[16]: 27214
谁能告诉我为什么
在写这篇文章的时候,我有了一个新的想法
s1list = s1.Mean.tolist()
solddf['WeeklySales'] = s1list
solddf.WeeklySales.isnull().sum()
Out[20]: 0
但是,仍然很好奇前面的方法有什么问题 与其尝试对齐两个索引并插入新行,不如使用 通过这种方式,您可以使用
how
kwarg选择您也希望执行的连接类型
我还建议阅读,因为它涵盖了许多有用的数据帧组合方法 这很奇怪。是
s1.index
==solddf.index
?。如果序列具有不同的索引集,则函数可能无法正常工作。这就是为什么转换为列表时它会起作用的原因。它们没有匹配的索引。。我不明白为什么会出现问题,因为我从s1中取出了条形码。INDEXB它们都有相同的索引,因为您正试图将序列分配给数据帧。它们将被分配到各自的索引中。问题在于排序_值和重置_索引。如果要关联它们而不考虑索引,而不是将它们转换为列表,也可以执行solddf['WeeklySales']=s1.Mean.values
output = pd.merge(solddf, s1, on='Barcode')