【问题标题】:Turn columns with non-distinct values (from csv) into columns with unique/distinct values (saved in new csv) by using Pandas dataframe?使用 Pandas 数据框将具有非不同值(来自 csv)的列转换为具有唯一/不同值(保存在新 csv 中)的列?
【发布时间】:2020-02-13 19:24:11
【问题描述】:

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

【问题讨论】:

  • 明确地说,您是在尝试将所有列值彼此完全分离,但仍将数据作为列包含?
  • 好吧,每一列都独立于另一列,对于每一列,我只想保留不同的值。所以我可以说/看到'在'A'列中,只有这个和这个和这个值存在;在“B”列中,仅存在 this 和 this 和 this 值; ...等等等等..列之间没有关系,只是想保持每列的不同值。
  • 只是想仔细检查一下这就是你想要的
  • 如果您想要的只是唯一值,为什么还要保留该 CSV 格式的输出?
  • 只是为了以后能够在 Excel 中打开它。在检查了不同的值之后,我想用其他值替换其中的一些(如果需要)(我可能会在 excel 中这样做,因为它需要更多的动手,还不知道)。这只是我正在研究的一个小例子。

标签: python pandas csv unique distinct


【解决方案1】:

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

【讨论】:

  • 完美!保存到 .csv 时,NaN 会留下一个空单元格(正是我想要的)!
  • 很高兴我可以按照您的要求为您解决问题,尽管我对应用程序有保留哈哈。您在 cmets 中说“我可能会在 excel 中这样做,因为它需要更多的动手能力”,如果您已经在数据框中拥有数据,我会鼓励您尝试一些在 python 生态系统中工作的东西,因为它可以是功能强大,如果不是更强大,如果你有系统地这样做
  • 你说得对,Python 在很多方面都更强大,但由于我还在学习,需要相当长的时间才能准确地编写代码,因此在 Excel 中手动执行某些操作会更快而不是在 Python 中针对数据库中的个别案例进行硬编码。但可以肯定的是,我们的目标是尽可能多地使用 Python 来提高我的编程技能。如果它有效,它会很棒而且速度很快。
  • 如果你愿意,你也可以帮忙做这个吗? (这是对这个问题的补充,我今天已经为此苦苦挣扎了一段时间):stackoverflow.com/questions/60230730/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2021-05-25
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多