2016-04-04 3 views
1

У меня есть dataframe, который имеет категориальные переменные с сотнями различных значений.Python Pandas Dataframe: заменить переменную на частоту

Я могу проверить частоту этих уровней с использованием «values_count()» функция использования GroupBy о + reset_index() ...

Я пытался заменить эти сотни значений по их (и позже уровни слияния с низкой мощностью). Я пытался подключиться к двум различным кадрам данных (один со значениями, а другой с подсчетами), но у меня проблемы ...

Например, таблица частот будет ниже, примерно 300 записей (все уникальный):

v_catego Time 
0  AA 353 
1  AAC 136 
2  ABB  2 
3  ABC  1 
4  ACA 13 

300  ZZZ 33 

оригинальный dataframe:

  V_vatego 
    0  AA 
    1  AAC 
    2  ABB  
    3  AAC  
    4  DA 
    5  AAC 
................ 

, где я хотел бы заменить (или добавить еще одну переменную) по значениям 'Время' для каждого экземпляра:

v_catego new_v_catego 
0  AA 353 
1  AAC 136 
2  ABB  2 
3  AA 353 
4  AAC 136 
................. 

Я знаю, что в R есть простая функция, которая делает это. Есть ли эквивалент в python?

ответ

1

IIUC вы можете использовать concat, но прежде чем вы должны установить те же категории в обоих Series (колонны) по add_categories:

print df 
    v_catego Time 
0  AA 353 
1  AAC 136 
2  ABB  2 
3  AA 353 
4  AAC 136 

print df1 
    v_catego Time 
0  ABC  1 
1  ACA 13 

#remember old cat in df1 
old_cat = df1['v_catego'] 

#set same categories in both dataframes in column v_catego 
df1['v_catego'] = df['v_catego'].cat.add_categories(df1['v_catego']) 
df['v_catego'] = df['v_catego'].cat.add_categories(old_cat) 
print df.v_catego 
0  AA 
1 AAC 
2 ABB 
3  AA 
4 AAC 
Name: v_catego, dtype: category 
Categories (5, object): [AA, AAC, ABB, ABC, ACA] 

print df1.v_catego 
0  AA 
1 AAC 
Name: v_catego, dtype: category 
Categories (5, object): [AA, AAC, ABB, ABC, ACA] 
print pd.concat([df,df1]) 
    v_catego Time 
0  AA 353 
1  AAC 136 
2  ABB  2 
3  AA 353 
4  AAC 136 
0  AA  1 
1  AAC 13 

EDIT:

Я думаю, вы можете использовать merge:

print df 
    v_catego 
0  AA 
1  AAC 
2  ABB 
3  AA 
4  AAC 
5  ABB 
6  AA 
7  AAC 
8  AA 
9  AAC 
10  AAC 
11  ABB 
12  AA 
13  AAC 
14  ABB 
15  AA 
16  AAC 
17  AA 
18  AAC 
df1 = df['v_catego'].value_counts() 
        .reset_index(name='count') 
        .rename(columns={'index': 'v_catego'}) 
print df1 
    v_catego count 
0  AAC  8 
1  AA  7 
2  ABB  4 

print pd.merge(df,df1,on=['v_catego'], how='left') 
    v_catego count 
0  AA  7 
1  AAC  8 
2  ABB  4 
3  AA  7 
4  AAC  8 
5  ABB  4 
6  AA  7 
7  AAC  8 
8  AA  7 
9  AAC  8 
10  AAC  8 
11  ABB  4 
12  AA  7 
13  AAC  8 
14  ABB  4 
15  AA  7 
16  AAC  8 
17  AA  7 
18  AAC  8 
+0

благодарит за быстрый ответ Jezrael. Я добавил дополнительные комментарии. Я думаю, теперь это яснее ... – mik

+0

Это место! – mik

+0

Супер, удачи! – jezrael

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