Подсчитать количество строк в ячейке / строке в Python Python - PullRequest
0 голосов
/ 09 июня 2018

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

Например, если у меня есть такой фрейм данных:

ID            A            B
1           1,2,1,2      1,2,3,4
2           1,2,3,4      1,2,1,2
3           1,2,3        3,4
4           4,1       

Ожидаемый результат должен быть примерно таким:

ID            A            B           countA         countB 
1           1,2,1,2      1,2,3,4         2               4
2           1,2,3,4      1,2,1,2         4               2
3           1,2,3        3,4             3               2
4           4,1                          1               0

Любые ценимые мысли. Я смотрел на groupby, unique и size, однако это относится только к уникальным строкам, а не к записям внутри строки.,Надеюсь, мои объяснения достаточно ясны, заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

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

Ниже мы используем filter(None, ...), чтобы избежать подсчета пустых строк.

def counter(x):
    return [len(set(filter(None, i.split(',')))) for i in x]

for col in ['A', 'B']:
    df['count'+col] = counter(df[col])

print(df)

   ID        A        B  countA  countB
0   1  1,2,1,2  1,2,3,4       2       4
1   2  1,2,3,4  1,2,1,2       4       2
2   3    1,2,3      3,4       3       2
3   4      4,1                2       0
0 голосов
/ 09 июня 2018

Используйте iloc для пропуска первой строки и поэлементного подсчета на applymap уникальных значений по длинам set с разделенных значений:

#if missing values are NaNs
df1 = df.iloc[:, 1:].applymap(lambda x: len(set(x.split(','))) if isinstance(x, str) else 0)

#if missing values are empty strings
df1 = df.iloc[:, 1:].applymap(lambda x: len(set(x.split(','))) if x != '' else 0)

Последний join к исходному DataFrame с add_prefix для переименования столбцов:

df = df.join(df1.add_prefix('Count'))
print (df)
   ID        A        B  CountA  CountB
0   1  1,2,1,2  1,2,3,4       2       4
1   2  1,2,3,4  1,2,1,2       4       2
2   3    1,2,3      3,4       3       2
3   4      4,1      NaN       2       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...