使用Pandas DataFrame将唯一值及其在一个数据框中的出现转换为新数据框

问题描述 投票:1回答:1

我想将我的数据框的每个列标题下的值都不同的值变成一个数据框,该数据框在每个列标题下的值都不同,并在它们的特定列旁边显示它们。一个例子:

我的初始数据框在下面可见:

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文件中每一列的不同值,然后是每个元素在其特定列中的出现。

任何想法?

下面的代码用于将每列中的唯一值转换为新数据框。我尝试使用.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

我想将我的数据框的每个列标题下面的值都不同,变成一个数据帧,每个列标题下面的值都不同,并在它们旁边出现...]]

python pandas count unique
1个回答
1
投票

困难的部分是保持每一行中列的值对齐。为此,您需要从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
© www.soinside.com 2019 - 2024. All rights reserved.