【发布时间】:2015-11-02 19:12:42
【问题描述】:
问题: 如何'pd.read_csv'使给定列中的值是类型列表(列表在一列的每一行)?
当创建一个 DataFrame(从一个 dict,见下文)时,单个值的类型是 list。问题:将 DataFrame 写入文件并从文件读取回 DataFrame 后,我得到一个字符串而不是列表。
创建数据框import pandas as pd
dict2df = {"euNOG": ["ENOG410IF52", "KOG2956", "KOG1997"],
"neg": [[58], [1332, 753, 716, 782], [187]],
"pos": [[96], [659, 661, 705, 1228], [1414]]}
df = pd.DataFrame(dict2df)
值是一个列表
type(df.loc[0, 'neg']) == list # --> True
type(df.loc[0, 'neg']) == str # --> False
df.loc[1, 'neg'][-1] == 782 # --> True
写入文件
df.to_csv('DataFrame.txt', sep='\t', header=True, index=False)
从文件中读取
df = pd.read_csv('DataFrame.txt', sep='\t')
值是字符串而不是列表
type(df.loc[0, 'neg']) == list # --> False
type(df.loc[0, 'neg']) == str # --> True
df.loc[1, 'neg'][-1] == 782 # --> False
当然,可以在两种数据类型之间进行转换,但计算量大,需要额外的工作(见下文)
def convert_StringList2ListOfInt(string2convert):
return [int(ele) for ele in string2convert[1:-1].split(',')]
def DataFrame_StringOfInts2ListOfInts(df, cols2convert_list):
for column in cols2convert_list:
column_temp = column + "_temp"
df[column_temp] = df[column].apply(convert_StringList2ListOfInt, 1)
df[column] = df[column_temp]
df = df.drop(column_temp, axis=1)
return df
df = DataFrame_StringOfInts2ListOfInts(df, ['neg', 'pos'])
什么是更好(更pythonic)的解决方案? 迭代列表中的整数非常方便,而不必来回转换它们。 感谢您的支持!!
【问题讨论】: