python - 使用 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”填充。
解决方案
一个注意事项:数据框不是为不同长度数据的列设计的,因此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
推荐阅读
- c - 如何在 C 中以正确的方式从二进制结构中打印位域?
- git - 为什么git要添加父目录?
- javascript - 使用 Angular 从 API 访问数据(格式错误?)
- git - GIT:取消应用存储 - 指定的修订太多
- c# - 如何临时使用 Graphics.TranslateTransform
- heroku - Amazon S3 存储 Wagtail 媒体文件 - 仅 Heroku 上的服务器 500 错误
- angular - 为什么 [hidden] 在 forkJoin().subscribe() 之后不起作用?
- python - 在python中增加多行的一些列
- ios - IOS/Objective-C:代码中创建的tableview的无阻碍滚动(去除橡皮筋效果)
- python - 每 15 分钟更改一次日志文件名称而不覆盖