Получить уникальные значения и их вхождение из одного кадра данных в новый, используя Pandas DataFrame - PullRequest
2 голосов
/ 14 февраля 2020

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

Мой начальный кадр данных виден под:

A       B       C       D
0       CEN     T2      56
2       DECEN   T2      45
3       ONBEK   T2      84
NaN     CEN     T1      59
3       NaN     T1      87
NaN     NaN     T2      NaN
0       NaN     NaN     98
NaN     CEN     NaN     23
NaN     CEN     T1      65

, где A, B, C и D - заголовки столбцов с каждыми 9 значениями под ним (включая пробелы).

Мой предпочтительный выходной фрейм данных должен выглядеть следующим образом: (сначала столбец уникальных значений для каждого столбца в исходном фрейме данных и рядом с ним их вхождение в этом конкретном столбце)

A       B       C       D       A       B       C       D
0       CEN     T2      56      2       4       4       1
2       DECEN   T1      45      1       1       3       1
3       ONBEK   NaN     84      2       1       NaN     1
Nan     NaN     NaN     59      NaN     NaN     NaN     1
NaN     NaN     NaN     87      NaN     NaN     NaN     1
NaN     NaN     NaN     98      NaN     NaN     NaN     1
NaN     NaN     NaN     23      NaN     NaN     NaN     1
NaN     NaN     NaN     65      NaN     NaN     NaN     1

где A , B, C и D - заголовки столбцов, под которыми сначала находятся отдельные значения для каждого столбца из исходного .csv-файла и рядом с ним вхождение каждого элемента в их конкретном столбце.

Anybody ideas?

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

df
new_df=pd.concat([pd.Series(df[i].unique()) for i in df.columns], axis=1)
new_df.columns=df.columns
new_df

1 Ответ

1 голос
/ 14 февраля 2020

Сложной частью является сохранение значений столбцов в каждой строке выровненными. Для этого вам нужно создать новый фрейм данных из unique и pd.concat с value_counts сопоставлением с каждым столбцом этого нового фрейма.

new_df = (pd.DataFrame([df[c].unique() for c in df], index=df.columns).T
            .dropna(how='all'))

df_final = pd.concat([new_df, *[new_df[c].map(df[c].value_counts()).rename(f'{c}_Count') 
                                   for c in  df]], axis=1).reset_index(drop=True)

Out[1580]:
     A      B    C   D  A_Count  B_Count  C_Count  D_Count
0    0    CEN   T2  56      2.0      4.0      4.0        1
1    2  DECEN   T1  45      1.0      1.0      3.0        1
2    3  ONBEK  NaN  84      2.0      1.0      NaN        1
3  NaN    NaN  NaN  59      NaN      NaN      NaN        1
4  NaN    NaN  NaN  87      NaN      NaN      NaN        1
5  NaN    NaN  NaN  98      NaN      NaN      NaN        1
6  NaN    NaN  NaN  23      NaN      NaN      NaN        1
7  NaN    NaN  NaN  65      NaN      NaN      NaN        1

Если вам нужно только чтобы сохранить выравнивание между каждой парой столбца и его количеством, таким как A - A_Count, B - B_Count ..., просто используйте value_counts с reset_index некоторыми командами для изменения имен осей

cols = df.columns.tolist() + (df.columns + '_Count').tolist()
new_df = pd.concat([df[col].value_counts(sort=False).rename_axis(col).reset_index(name=f'{col}_Count') 
                        for col in df], axis=1).reindex(new_cols, axis=1)

Out[1501]:
     A      B    C     D  A_Count  B_Count  C_Count  D_Count
0  0.0  ONBEK   T2  56.0      2.0      1.0      4.0        1
1  2.0    CEN   T1  45.0      1.0      4.0      3.0        1
2  3.0  DECEN  NaN  84.0      2.0      1.0      NaN        1
3  NaN    NaN  NaN  59.0      NaN      NaN      NaN        1
4  NaN    NaN  NaN  87.0      NaN      NaN      NaN        1
5  NaN    NaN  NaN  98.0      NaN      NaN      NaN        1
6  NaN    NaN  NaN  23.0      NaN      NaN      NaN        1
7  NaN    NaN  NaN  65.0      NaN      NaN      NaN        1
...