问题描述
我有数据框
used_at common users pair of websites
0 2014 1364 avito.ru and e1.ru
1 2014 1716 avito.ru and drom.ru
2 2014 1602 avito.ru and auto.ru
3 2014 299 avito.ru and avtomarket.ru
4 2014 579 avito.ru and am.ru
5 2014 602 avito.ru and irr.ru/cars
6 2014 424 avito.ru and cars.mail.ru/sale
7 2014 634 e1.ru and drom.ru
8 2014 475 e1.ru and auto.ru
9 2014 139 e1.ru and avtomarket.ru
10 2014 224 e1.ru and am.ru
11 2014 235 e1.ru and irr.ru/cars
12 2014 154 e1.ru and cars.mail.ru/sale
13 2014 874 drom.ru and auto.ru
14 2014 247 drom.ru and avtomarket.ru
15 2014 394 drom.ru and am.ru
....
当我写 graph_by_common_users = common_users.pivot(index =对网站 'used_at',values ='common users')
我得到
When I write graph_by_common_users = common_users.pivot(index='pair of websites', columns='used_at', values='common users')
I get
used_at 2014 2015
pair of websites
am.ru and cars.mail.ru/sale 166.0 NaN
am.ru and irr.ru/cars 223.0 NaN
auto.ru and am.ru 408.0 224.0
auto.ru and avtomarket.ru 243.0 162.0
auto.ru and cars.mail.ru/sale 330.0 195.0
auto.ru and drom.ru NaN 799.0
auto.ru and irr.ru/cars 409.0 288.0
avito.ru and am.ru 579.0 262.0
....
而且我有 NaN
因为一些序列是不同的。例如
我有 2014
我有 am.ru和cars.mail.ru/sale
但到 2015
我有 cars.mail.ru/sale和am.ru
。我该怎么改呢?
And I have NaN
because some of sequence are different. For example I have for 2014
I have am.ru and cars.mail.ru/sale
but to 2015
I have cars.mail.ru/sale and am.ru
. How can I change that?
添加我的代码
import pandas as pd
import itertools
import matplotlib.pyplot as plt
df = pd.read_csv("avito_trend.csv", parse_dates=[2])
def f(df):
dfs = []
for x in [list(x) for x in itertools.combinations(df['address'].unique(), 2)]:
c1 = df.loc[df['address'].isin([x[0]]), 'ID']
c2 = df.loc[df['address'].isin([x[1]]), 'ID']
c = pd.Series(list(set(c1).intersection(set(c2))))
dfs.append(pd.DataFrame({'common users':len(c), 'pair of websites':' and '.join(x)}, index=[0]))
return pd.concat(dfs)
common_users = df.groupby([df['used_at'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index()
print common_users
graph_by_common_users = common_users.pivot(index='pair of websites', columns='used_at', values='common users')
print graph_by_common_users
推荐答案
测试后,我添加了反向组合 c_invert
,因为
。现在,所有组合
和 pivot
非常好:
After testing I add inverted combinations c_invert
, because some values were missing after pivot
. Now there are all combination
and pivot
works very well:
df = pd.read_csv("avito_trend.csv",
parse_dates=[2])
def f(df):
dfs = []
for x in [list(x) for x in itertools.combinations(df['address'].unique(), 2)]:
c1 = df.loc[df['address'].isin([x[0]]), 'ID']
c2 = df.loc[df['address'].isin([x[1]]), 'ID']
c = pd.Series(list(set(c1).intersection(set(c2))))
#add inverted intersection c2 vs c1
c_invert = pd.Series(list(set(c2).intersection(set(c1))))
dfs.append(pd.DataFrame({'common users':len(c), 'pair of websites':' and '.join(x)}, index=[0]))
#swap values in x
x[1],x[0] = x[0],x[1]
dfs.append(pd.DataFrame({'common users':len(c_invert), 'pair of websites':' and '.join(x)}, index=[0]))
return pd.concat(dfs)
common_users = df.groupby([df['used_at'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index()
print common_users.pivot(index='pair of websites', columns='used_at', values='common users')
used_at 2014 2015
pair of websites
am.ru and auto.ru 408 224
am.ru and avito.ru 579 262
am.ru and avtomarket.ru 133 72
am.ru and cars.mail.ru/sale 166 73
am.ru and drom.ru 394 187
am.ru and e1.ru 224 99
am.ru and irr.ru/cars 223 102
auto.ru and am.ru 408 224
auto.ru and avito.ru 1602 1473
auto.ru and avtomarket.ru 243 162
auto.ru and cars.mail.ru/sale 330 195
auto.ru and drom.ru 874 799
auto.ru and e1.ru 475 451
auto.ru and irr.ru/cars 409 288
avito.ru and am.ru 579 262
avito.ru and auto.ru 1602 1473
avito.ru and avtomarket.ru 299 205
avito.ru and cars.mail.ru/sale 424 256
avito.ru and drom.ru 1716 1491
avito.ru and e1.ru 1364 1153
avito.ru and irr.ru/cars 602 403
avtomarket.ru and am.ru 133 72
avtomarket.ru and auto.ru 243 162
avtomarket.ru and avito.ru 299 205
avtomarket.ru and cars.mail.ru/sale 105 48
avtomarket.ru and drom.ru 247 175
avtomarket.ru and e1.ru 139 105
avtomarket.ru and irr.ru/cars 139 73
cars.mail.ru/sale and am.ru 166 73
cars.mail.ru/sale and auto.ru 330 195
cars.mail.ru/sale and avito.ru 424 256
cars.mail.ru/sale and avtomarket.ru 105 48
cars.mail.ru/sale and drom.ru 292 189
cars.mail.ru/sale and e1.ru 154 105
cars.mail.ru/sale and irr.ru/cars 197 94
drom.ru and am.ru 394 187
drom.ru and auto.ru 874 799
drom.ru and avito.ru 1716 1491
drom.ru and avtomarket.ru 247 175
drom.ru and cars.mail.ru/sale 292 189
drom.ru and e1.ru 634 539
drom.ru and irr.ru/cars 423 277
e1.ru and am.ru 224 99
e1.ru and auto.ru 475 451
e1.ru and avito.ru 1364 1153
e1.ru and avtomarket.ru 139 105
e1.ru and cars.mail.ru/sale 154 105
e1.ru and drom.ru 634 539
e1.ru and irr.ru/cars 235 148
irr.ru/cars and am.ru 223 102
irr.ru/cars and auto.ru 409 288
irr.ru/cars and avito.ru 602 403
irr.ru/cars and avtomarket.ru 139 73
irr.ru/cars and cars.mail.ru/sale 197 94
irr.ru/cars and drom.ru 423 277
irr.ru/cars and e1.ru 235 148
如果您需要图形:
graph_by_common_users = common_users.pivot(index='pair of websites', columns='used_at', values='common users')
#sort by column 2014
graph_by_common_users = graph_by_common_users.sort_values(2014, ascending=False)
ax = graph_by_common_users.plot(kind='barh', width=0.5, figsize=(10,20))
[label.set_rotation(25) for label in ax.get_xticklabels()]
rects = ax.patches
labels = [int(round(graph_by_common_users.loc[i, y])) for y in graph_by_common_users.columns.tolist() for i in graph_by_common_users.index]
for rect, label in zip(rects, labels):
height = rect.get_height()
ax.text(rect.get_width() + 3, rect.get_y() + rect.get_height(), label, fontsize=8)
这篇关于与 pandas 不同的名字序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!