2015-04-13 13 views
0

У нас есть два файла CSV: a.csv и b.csv.Python Pandas: как обновить файл csv из другого csv-файла

a.csv имеет дерево столбцов: ярлык, item1, ITEM2. b.csv имеет две колонки: item1, item2. Если ITEM1 и item2 в a.csv также occurr в b.csv, это a.csv и b.csv имеют тот же item1 и item2, значение метки в a.csv должно быть вместо этого. Как использовать панды для решения?


Например:

a.csv:

label item1  item2 
0   123  35 
0   342  721 
0   876  243 

b.csv:

item1  item2 
12  35 
32  721 
876  243 

Result.csv:

label item1  item2 
0   123  35 
0   342  721 
1   876  243 

Я попытался это, но он не работает:

import pandas as pd 

df1 = pd.read_csv("~/train_dataset.csv", names=['label', 'user_id', 'item_id', 'behavior_type', 'user_geohash', 'item_category', 'time','sales'], parse_dates=True) 
df2 = pd.read_csv(~/train_user.csv", names=['user_id', 'item_id', 'behavior_type', 'user_geohash', 'item_category', 'time', 'sales'], parse_dates=True) 
df1.loc[(df1['user_id'] == df2['user_id'])& (df1['item_id'] == df2['item_id']), 'label'] = 1 
+0

Должны ли элементы быть в одной строке в обоих файлах 'csv', или может ли данная строка в' a.csv' появляться где-нибудь в 'b.csv'? – TheBlackCat

ответ

0

Вы можете использовать loc и логическое условие, чтобы скрыть свой DF (здесь представляющий a.csv) и установите метку 1 если это условие выполнено:

In [18]: 

df.loc[(df['item1'] == df1['item1'])& (df['item2'] == df1['item2']), 'label'] = 1 
df 
Out[18]: 
    label item1 item2 
0  0 123  35 
1  0 342 721 
2  1 876 243 

Если вы хотите установить все значения строк можно использовать np.where:

In [19]: 

np.where((df['item1'] == df1['item1'])& (df['item2'] == df1['item2']), 1, 0) 
Out[19]: 
array([0, 0, 1]) 
In [20]: 

df['label'] = np.where((df['item1'] == df1['item1'])& (df['item2'] == df1['item2']), 1, 0) 
df 
Out[20]: 
    label item1 item2 
0  0 123  35 
1  0 342 721 
2  1 876 243 
Смежные вопросы