Как подсчитать значения в повторяющихся строках в панд

#python #pandas #dataframe

Вопрос:

Хотя это кажется легкой проблемой, я некоторое время боролся с ней. У меня есть два кадра данных, между которыми я хочу определить дубликаты по определенным столбцам, а затем я хочу суммировать значения обоих кадров данных по другому столбцу. Я сделаю все возможное, чтобы показать это. В следующих таблицах описана структура двух фреймов данных, которые я буду называть df1 и df2.

делать 2019-12-01 2019-06-04
БМВ 0 3
фольксваген 1 3
делать 2018-12-01 2019-06-04
ТЕСЛА 0 2
фольксваген 2 2

это моя попытка

 df = pd.concat ([df1, df2], axis=1)
    df_2 = df [df.duplicated (subset=[ 'make'], keep=False)]
    df_2 = pd.DataFrame(df_2)
    valuePosition1 = df_2.columns.get_loc(2019-12-01)
    valuePosition2 = df_2.columns.get_loc(2018-12-01)
    flow = min(df_2.iloc[:, valuePosition1].sum(), df_2.iloc[:, valuePosition2].sum())
    print(flow)

 

ответ должен быть 1, так как VW есть как в df1[2019-12-01], так и в df2[2018-12-01]. Но я продолжаю получать странные ошибки:

 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
 

Который, похоже, даже не понимает, что я делаю. Я действительно не в своем уме. Оба кадра данных также очень большие, поэтому мне понадобится быстрый способ сделать это.

Любое руководство или помощь будут оценены по достоинству!

Комментарии:

1. Не могли бы вы включить весь соответствующий код, пожалуйста? Где df.дублированный, определенный и т. Д. И будьте осторожны с интервалом «get_loc (2019-12-01)».

2. Ах, спасибо вам. дублирование-это функция панд, которую я нашел. Я включу ссылку. Я надеюсь, что это то, о чем вы спрашиваете.

3. pandas.pydata.org/pandas-docs/stable/reference/api/…

Ответ №1:

Лучше объединить вдоль оси строк ( concat(..., axis=0) ), так duplicated как предполагается, что она будет работать вдоль этой оси:

Возвращает логический ряд, обозначающий повторяющиеся строки.

Вы также можете использовать loc (который в основном основан на метках), а не iloc (который в основном основан на целочисленных позициях), учитывая, что вы знаете, какие столбцы вас интересуют.

 import pandas as pd

df1 = pd.read_csv('sample1.csv', sep='s ')
df2 = pd.read_csv('sample2.csv', sep='s ')

df = pd.concat([df1,df2], axis=0)
print(df)

dfd = df[df.duplicated(subset=['make'], keep=False)]
print(dfd)

flow = min(dfd.loc[:, '2019-12-01'].sum(),
           dfd.loc[:, '2018-12-01'].sum())
print(flow)
 

Вывод из df

     make  2019-12-01  2019-06-04  2018-12-01
0    BMW         0.0           3         NaN
1     VW         1.0           3         NaN
0  TESLA         NaN           2         0.0
1     VW         NaN           2         2.0
 

Вывод из dfd

   make  2019-12-01  2019-06-04  2018-12-01
1   VW         1.0           3         NaN
1   VW         NaN           2         2.0
 

Выход из потока

 1.0
 

Комментарии:

1. Спасибо! Это действительно полезно !