使用Pandas dataframe将具有非唯一值(来自csv)的列转换为具有唯一/不同值(保存在新csv中)的列?

2024-04-25 05:24:55 发布

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

我想将每个列标题下具有非不同值的.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”填充


Tags: 文件csvto标题dataframedfpdt1
1条回答
网友
1楼 · 发布于 2024-04-25 05:24:55

注意:数据帧不是为不同长度的数据列设计的,因此填充长度的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

相关问题 更多 >