Как мы применяем пользовательскую функциональность для метода numpy nunique? - PullRequest
0 голосов
/ 18 октября 2018

Рассмотрим следующий код:

[sample.csv]
      Name   Year    Status
 1     ABC    2017    200
 2     DEF    2017    404
 3     GHI    2018    404
 4     JKL    2017    500
 5     MNO    2017    200
 6     PQR    2017    301 

Ожидаемый результат,

Сумма №.количество уникальных записей из столбца status и группировка по столбцу Year, без , напрямую используя "nunique ()" , но с "chunk" концепция (например, 2 записи одновременно)

Как обычно, для получения нет.уникальных значений для столбца,

dataset = pd.read_csv(source_file)
dataset.groupby(['year']).nunique()

Теперь я использую следующий код для достижения функциональности «nunique ()», но иногда он не возвращает правильный результат при обработке очень большого файла CSV(более 5 ГБ).

import pandas as pd

chunks = pd.read_csv(source_file, chunksize=100000)

data_grp1 = pd.DataFrame() 
for dataset in chunks:
    gb = dataset.groupby(['year'])
    #data_grp1 = gb['status'].nunique() 

    # If we apply the above method/line directly,
    # then our final result would not be correct (it is suitable for only 
    # one shot processing), so I'm using the following lines (Even, 
    # sometimes it is also returns the Incorrect result for large CSV files, 
    # small size files are OK!)

    data_grp1 = pd.concat([data_grp1, gb['status'].unique()])

def nu_fn(x):
    return len(set(np.concatenate(x.values, axis=0)))

res = data_grp1.groupby(['year'], level=0, axis=0)[0].apply(nu_fn)

print(res)

Как добиться того же результата, не используя встроенную функцию "nunique ()"?

Есть идеи, тогда, пожалуйста ... Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы отфильтровали на уровне чанка, но не отфильтровали по чанкам:

data_grp1 = pd.concat([data_grp1, gb['status'].unique()])

Что вам нужно сделать, это снова отфильтровать после создания окончательного data_grp1, например:

data_grp2 = data_grp1.groupby('Year').apply(lambda df: df.drop_duplicates(subset=['status']))

А затем сделайте свой окончательный анализ data_grp2

0 голосов
/ 18 октября 2018

Давайте попробуем что-то другое, используя pd.factorize:

df.groupby('Year')['Status'].apply(lambda x: max(pd.factorize(x)[0]) + 1)

Вывод:

Year
2017    4
2018    1
Name: Status, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...