使用dataframe从一个dataframe中获取唯一值及其引用,并将其放入新的dataframe中

2024-09-30 01:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将每个列标题下具有非不同值的数据帧转换为每个列标题下具有不同值的数据帧,并在其旁边的特定列中出现这些值。例如:

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

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\u计数来获取每列中的出现次数,但在那里,我无法使用唯一的值将其再次放入一个数据帧中

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

Tags: columns数据标题dfnew情况nanpd
1条回答
网友
1楼 · 发布于 2024-09-30 01:33:21

困难的部分是保持每行中列的值对齐。为此,您需要从uniquepd.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_CountB-B_Count……,只需使用value_countsreset_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

相关问题 更多 >

    热门问题