Munging выбора строк в CSV-файлов с помощью панды


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

Задача sum() значения некоторых клавиш, в то время как другие не суммируются. Мое решение было добавить столбец с названием "линии", где элементы с одинаковым числом линии будет суммироваться.

sales = [{"Line": 1, "KEY": "Apples", "AMOUNT": 3.99},
         {"Line": 1, "KEY": "Apples", "AMOUNT": 3.99},
         {"Line": 2, "KEY": "Oranges", "AMOUNT": 5.99},
         {"Line": 3, "KEY": "Pears", "AMOUNT": 2.99},
         {"Line": 3, "KEY": "Pears", "AMOUNT": 2.99},
         {"Line": 4, "KEY": "Carrots", "AMOUNT": .99},
         {"Line": 5, "KEY": "Carrots", "AMOUNT": .99},
        ]

df = pd.DataFrame(sales)

Теперь, панды groupby может показаться идеальным решением, но так как мне нужно экспортировать специально видоизмененные файл как CSV, это казалось, что я мог сделать только для того, чтобы отменить.

# Find duplicate Line entries
# Subset df into just duplicate `Line` values
df_tmp = df[df.duplicated(subset="Line", keep=False)]

# Save a list of Line numbers to sum
line_dups = df_tmp['Line'].unique()

for x in line_dups:
    # Sum every line in the DF; one value sum is unchanged
    # asum = df.loc[df['Line'] == x, 'AMOUNT'].sum()
    # or
    # Subset the subset
    df_tmp2 = df_tmp[df_tmp["Line"] == x]
    # sum the sub-subset
    asum = df_tmp2['AMOUNT'].sum()
    # set the value of all keys with the same Line value
    df.loc[df['Line'] == x, 'AMOUNT'] = asum
    # take the inverse of the duplicate subset on the original df
    # Keep only the first duplicate line
    df2 = df[~df.duplicated(subset="Line", keep='first')]

Решение является эффективным, df2:

  AMOUNT    KEY     Line
0   7.98    Apples  1
2   5.99    Oranges 2
3   5.98    Pears   3
5   0.99    Carrots 4
6   0.99    Carrots 5

И еще, это решение вроде волосатый со всех временных таблиц данных. Может быть, более опытных пользователей панд есть, что добавить, что может помочь мне лучше понять панды?



195
4
задан 1 апреля 2018 в 06:04 Источник Поделиться
Комментарии
1 ответ

Если у вас есть Line столбец в CSV-сама, вы можете заменить то, что вы есть с:

df.groupby(['Line', 'KEY']).agg({'AMOUNT': 'sum'}).reset_index()

0
ответ дан 4 апреля 2018 в 06:04 Источник Поделиться