使用 Pandas 数据框将具有 non-distinct 值的列(来自 csv)转换为具有 unique/distinct 值的列(保存在新的 csv 中)?
Turn columns with non-distinct values (from csv) into columns with unique/distinct values (saved in new csv) by using Pandas dataframe?
我想将我的 .csv-file 与每列下方 non-distinct 值 header 转换为每列下方具有不同值的 .csv header (只是想知道一个巨大的每一列的所有唯一值。csv-file)。一个例子:
我的初始 .csv-file 可见(左),在 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 是 header 列,每 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 是 header 列,它们下面只有每列与原始 .csv-file.
不同的值
我尝试使用 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
我想将我的 .csv-file 与每列下方 non-distinct 值 header 转换为每列下方具有不同值的 .csv header (只是想知道一个巨大的每一列的所有唯一值。csv-file)。一个例子:
我的初始 .csv-file 可见(左),在 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 是 header 列,每 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 是 header 列,它们下面只有每列与原始 .csv-file.
不同的值我尝试使用 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