добавление двух значений панд данных в фрейме, только если значение строки и столбца совпадает - PullRequest
0 голосов
/ 29 мая 2018

У меня есть два фрейма данных с разными размерами, один из которых больше другого, но у второго фрейма больше столбцов.

У меня проблемы с попыткой добавить фрейм данных, если у него один и тот же столбец& значение строки как другой фрейм данных, который в данном случае является id

, это некоторые фиктивные данные и то, как я пытался их решить

import pandas as pd

df1 = pd.DataFrame([(1,2,3),(3,4,5),(5,6,7),(7,8,9),(100,10,12),(100,10,12),(100,10,12)], columns=['id','value','c'])
df2 = pd.DataFrame([(1,200,3,4,6),(3,400,3,4,6),(5,600,3,4,6),(5,620,3,4,6)], columns=['id','value','x','y','z'])

, поэтому, если id df1и df2 совпадают, затем добавьте значение столбца к значению в "whatToAdd"

data

df1: 
         id    value    c     
         1     2        3     
         3     4        5     
         5     6        7
         7     8        9     
         100   10       12    
         100   10       12
         100   10       12
df2: 
         id    value    x     y    z
         1     200      3     4    6
         3     400      3     4    6
         5     600      3     4    6
         5     620      3     4    6 

Ожидается:

  Out: 
     id    value    x     y    z
     1     202      3     4    6
     3     404      3     4    6
     5     606      3     4    6
     5     626      3     4    6 

попробовано:

for each in df1.a:
    if(df2.loc[df2['a'] == each]):
        df2['a']+=df['a']

выдает ошибку «Истинное значение DataFrame неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ()."что сбивает с толку для меня, потому что я попытался:

df2.loc[df2['a']==1

из цикла, и это работает

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Вот однострочник.

df2.loc[:, 'value'] += [df1.set_index('id').loc[i, 'value'] for i in df2.id]
print(df2)
>>>
   id  value  x  y  z
0   1    202  3  4  6
1   3    404  3  4  6
2   5    606  3  4  6
3   5    626  3  4  6
0 голосов
/ 29 мая 2018

После того, как вы установили для обоих фреймов данных одинаковый индекс:

df1 = df1.set_index("id")
df2 = df2.set_index("id")

Вы можете выполнить одну очень простую операцию:

mask = df1.index.isin(df2.index)
df2["value"] += df1.loc[mask, "value"]

Вывод:

    value   x   y   z
id              
1   202     3   4   6
3   404     3   4   6
5   606     3   4   6
5   626     3   4   6

Вы всегда можете сделать df2.reset_index(), чтобы вернуться к исходным настройкам.

0 голосов
/ 29 мая 2018

Вот код, который я придумал.Он использует dict для поиска значения каждого идентификатора в df1.Затем можно использовать карту для поиска значения каждого идентификатора в df2, создавая серию, которая затем добавляется в df2 ['value'] для получения желаемого результата.

df1_lookup = dict(df1.set_index('id')['value'].items())
df2['value'] += df2['id'].map(lambda x: df1_lookup.get(x, 0))
0 голосов
/ 29 мая 2018

Вы можете использовать set_index с add, затем следовать с reindex

df1.set_index('id').add(df2.set_index('id'),fill_value=0).dropna(axis=0).reset_index().reindex(columns=df2.columns)
Out[193]: 
   id  value    x    y    z
0   1  202.0  3.0  4.0  6.0
1   3  404.0  3.0  4.0  6.0
2   5  606.0  3.0  4.0  6.0
3   5  626.0  3.0  4.0  6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...