2017-01-24 3 views
1
применять

Так у меня есть некоторые данные, такие как:crossreferencing панды dataframe в

a.csv: 

id, ..., name 
1234, ..., R 
1235, ..., Python 
1236, ..., Panda 
... etc 

b.csv: 

id, ..., amount 
1234, ..., 1 
1234, ..., 1 
1234, ..., 2 
... 
1236, ..., 1 
1236, ..., 1 

Я пытаюсь перекрестные ссылки идентификаторы между a.csv и b.csv для того, чтобы добавить столбец количество моей панд dataframe для a.csv. Эта величина является «суммой сумм в b.csv для идентификатора соответствия этой строки».

Я пытаюсь использовать функцию применять следующим образом:

import pandas as pd 
    def itemcounts(row): 
     # ok this works? 
     # return b[b['id'] == 1234]['amount'].sum() 
     # each a['quantity'] gets set to 4 or whatever the sum for 1234 is. 

     # and this does? 
     # return row['id'] 
     # a['quantity'] get set to whatever row's 'id' is. 

     # but this doesn't 
     id = row['id'] 
     return b[b['id'] == id]['amount'].sum() 
     # a['quantity'] is 0. 

    a = pd.read_csv('a.csv') 
    b = pd.read_csv('b.csv') 
    a['quantity'] = a.apply(itemcounts, axis=1) 

Однако, как отмечалось в комментариях я не могу применить, чтобы найти подходящие строки в b получить сумму. Я ожидаю, что у меня отсутствует что-то фундаментальное для python или pandas.

Я пробовал придать row['id'] int в itemcounts, но это все еще не сработало для меня.

+0

ли она использовать 'apply'? У меня есть решение, которого нет. –

+0

Благодарим вас за помощь. Оказывается, я был жертвой грязных данных. Оба файла были около 1000 строк, но идентификаторы на самом деле не выровнялись для всех случаев. –

ответ

0

Этот скрипт работает для меня:

import pandas as pd 
a = pd.read_csv('a.csv') 
b = pd.read_csv('b.csv') 

a['Quantity'] = a['id'].apply(lambda x: b[b.id == x].amount.sum()) 

Использование «лямбда» в функции применения позволяет использовать применить каждую строку столбца в функцию как "Икс".

Принимая:

id name 
0 1234  r   
1 1235 Python  
2 1236 Panda 

и б:

 id amount 
0 1234  1 
1 1234  1 
2 1234  2 
3 1236  1 
4 1236  1 

возвращает:

 id name Quantity 
0  1234  r   4 
1  1235 Python   0 
2  1236 Panda   2 
+0

Эй, спасибо, как оказалось, и мое решение, и твоя работа. Моя проблема заключалась в том, что a.csv имеет 1000 строк, а b.csv имеет 1000 строк, но для каждой строки в a.csv у нас есть 1 идентификатор, тогда как каждый ID может иметь 200 строк в b.csv. Поэтому, конечно, когда я увидел «количество: 0» для всех моих (видимых) результатов, я предположил, что я глуп, а не мои данные. –

2

Попробуйте это:

df = pd.DataFrame({'id' : [1234, 1235, 1236], 'name' : ['R', 'Python', 'Pandas']}) 

    id name 
0 1234  R 
1 1235 Python 
2 1236 Pandas 

df1 = pd.DataFrame({'id' : [1234, 1234, 1234, 1234, 1234, 1235, 1235, 1236], 'amount' : [1, 1, 2, 1, 2, 2, 1, 1]}) 

    amount id 
0  1 1234 
1  1 1234 
2  2 1234 
3  1 1234 
4  2 1234 
5  2 1235 
6  1 1235 
7  1 1236 

df['quantity'] = df1.groupby('id').agg(sum).values 

    id name quantity 
0 1234  R   7 
1 1235 Python   3 
2 1236 Pandas   1 
+0

Это решение дало мне «ValueError: длина значений не соответствует длине индекса», потому что, как я уже отмечал выше, мои данные были грязными. –

+0

Это было очень полезно при определении проблемы. Спасибо –

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