首页 > 解决方案 > 使用 Pandas 数据框将具有非不同值(来自 csv)的列转换为具有唯一/不同值(保存在新 csv 中)的列?

问题描述

我想将每个列标题下方具有非不同值的 .csv 文件转换为每个列标题下方具有不同值的 .csv(只想知道巨大 .csv 文件的每一列的所有唯一值)。一个例子:

我的初始 .csv 文件是可见的(左),在 Excel 中显示为(见右):

A,B,C,D                                        A       B       C       D
1,CEN,T2,56                                    1       CEN     T2      56
2,DECEN,T3,45                                  2       DECEN   T3      45
1,ONBEK,T2,84                                  1       ONBEK   T2      84
1,CEN,T1,59                                    1       CEN     T1      59
2,CEN,T1,87                                    2       CEN     T1      87

其中 A、B、C 和 D 是列标题,下面各有 5 个值。

我首选的输出 .csv 文件应如下所示(见左图,右图是在 Excel 中打开时):

A,B,C,D                                        A       B       C       D
1,CEN,T2,56                                    1       CEN     T2      56
2,DECEN,T3,45                                  2       DECEN   T3      45
,ONBEK,T1,84                                           ONBEK   T1      84
,,,59                                                                  59
,,,87                                                                  87

其中 A、B、C 和 D 是列标题,其下方只有原始 .csv 文件中每列的不同值。

我尝试使用 Pandas 数据框来执行此任务,但是我无法获得我喜欢的输出(我坚持将每列的唯一数据框合并在一起,因为它们的长度不同)。

请看下面的代码:

import pandas as pd

df = pd.read_csv(csv_file, encoding='utf-8') #read .csv in pandas dataframe

columnnames = list(df.columns)
print(columnnames)

df2 = pd.DataFrame()

for col in df:
    result = df[col].unique()   #creates a list with distinct values
    print(result)
    output = pd.DataFrame(result)   #to transform the distinct list back into a dataframe
    print(output)
    df2.append(output) #tries to merge all the lists with unique values from the loop into the new dataframe df2
    df2.columns = columnnames
    print(df2)

df2.to_csv("c_" + csv_file, sep=',') #write pandas dataframe to .csv

有人有什么想法吗?因为我在每一列中搜索不同的值,所以每一列可以有不同的长度。最好是最后一个不同的单元格之后的那些单元格是空的(参见首选输出)。如果这是不可能的,如有必要,它们总是可以用“NaN”或“NULL”填充。

标签: pythonpandascsvuniquedistinct

解决方案


一个注意事项:数据框不是为不同长度数据的列设计的,因此NaN填充长度的值最有意义(正如您在问题中指出的那样)

df

    A   B       C   D
0   1   CEN     T2  56
1   2   DECEN   T3  45
2   1   ONBEK   T2  84
3   1   CEN     T1  59
4   2   CEN     T1  87

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

new_df.columns=df.columns

new_df

    A   B       C   D
0   1.0 CEN     T2  56
1   2.0 DECEN   T3  45
2   NaN ONBEK   T1  84
3   NaN NaN     NaN 59
4   NaN NaN     NaN 87

推荐阅读