2016-03-27 2 views
2

У меня есть dataframeDifferent последовательность имен с пандами

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='pair of websites', columns='used_at', values='common users') я получаю

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 and cars.mail.ru/sale, но до 2015 У меня есть cars.mail.ru/sale and am.ru. Как я могу это изменить?

Добавить мой код

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 

Picture with graph

+0

Просьба уточнить, что вы хотите иметь после поворота вместо NaNs? – MaxU

+0

У меня есть 'am.ru и cars.mail.ru/sale' до '2014' и' cars.mail.ru/sale и am.ru 'за' 2015'. При попытке печати граф 'прямоугольников = ax.patches лейбл = [Int (круглых (graph_by_common_users.loc [я, у])) для г в graph_by_common_users.columns.tolist() для I в graph_by_common_users.index] для rect, label в zip (rects, labels): height = rect.get_height() ax.text (rect.get_x() + rect.get_width()/2, height + 5, label, ha = 'center', va = 'bottom') 'У меня ошибка, потому что у меня есть« NaN ». Поэтому я хочу обратить вспять некоторую строку, например 'am.ru и cars.mail.ru/sale'' '2014' и' 2015' – ldevyataykina

+0

Было ли мое объяснение понятным? – ldevyataykina

ответ

1

После тестирования я добавляю инвертированные комбинации c_invert, потому что некоторые значения отсутствовали после pivot. Теперь есть все combination и pivot работает очень хорошо:

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) 
+0

Пожалуйста, проверьте его. – jezrael

+0

ты мой спаситель! спасибо – ldevyataykina

+0

Рад может вам помочь. :) Приятный день. – jezrael

2

Может быть, прежде чем роторные, попробуйте расщеплению на " and ", а затем сортировка поэтому каждый столбец в том же порядке:

df['pair of websites'] = df['pair of websites'].str.split(' and ') 
df['pair of websites'] = df['pair of websites'].apply(lambda x: frozenset(sorted(x))) 

Похоже, что должно работайте до тех пор, пока в "и" части для каждой записи будет одинаковое количество пробелов. Если нет, возможно, вам придется использовать str.strip().

+0

ничего не меняет – ldevyataykina

+0

@ldevyataykina Он должен был быть, если вы это сделали до поворота. Если нет, мне было бы интересно увидеть результат, чтобы я мог понять, что пошло не так. –

+0

Первая строка возвращает 'TypeError: unhashable type: 'list'' – ldevyataykina

Смежные вопросы