Python将逗号分隔的列表转换为pandas数据帧。

23

我正在努力将逗号分隔的列表转换为具有多列(7列)的数据框。

print (type(mylist))

<type 'list'>
Print(mylist)


['AN,2__AAS000,26,20150826113000,-283.000,20150826120000,-283.000',         'AN,2__AE000,26,20150826113000,0.000,20150826120000,0.000',.........
以下创建一个单列框架:
df = pd.DataFrame(mylist)
我已经审查了Pandas内置的CSV功能,但我的CSV数据存储在列表中。我该如何将列表简单地转换为一个7列的数据帧?
提前感谢。

我已经限制了结果,因为有2k行。数据框已创建,但是当我打印(df)时,会输出所有数据,后面跟着[1922行x1列]。 - user636322
我刚刚更新了主要文本,加入了列表的实际输出。谢谢。 - user636322
不,我想看print(mylist[:3])的输出。 - EdChum
'AN,2__AAS000,26,20150826113000,-283.000,20150826120000,-283.000', 'AN,2__AE000,26,20150826113000,0.000,20150826120000,0.000' 'AN,2__AAS000,26,20150826113000,-283.000,20150826120000,-283.000','AN,2__AE000,26,20150826113000,0.000,20150826120000,0.000'。 - user636322
谢谢EdChum,你很在行。 - user636322
显示剩余5条评论
3个回答

41
你需要拆分列表中的每个字符串:
import  pandas as pd

df = pd.DataFrame([sub.split(",") for sub in l])
print(df)

输出:

   0         1   2               3         4               5         6
0  AN  2__AS000  26  20150826113000  -283.000  20150826120000  -283.000
1  AN   2__A000  26  20150826113000     0.000  20150826120000     0.000
2  AN  2__AE000  26  20150826113000  -269.000  20150826120000  -269.000
3  AN  2__AE000  26  20150826113000  -255.000  20150826120000  -255.000
4  AN   2__AE00  26  20150826113000  -254.000  20150826120000  -254.000

如果你知道在csv文件中需要跳过多少行元数据,你可以使用skiprows=lines_of_metadata参数在read_csv函数中完成此操作:

import  pandas as pd

df = pd.read_csv("in.csv",skiprows=3,header=None)
print(df)

或者,如果元数据每行都以特定字符开头,您可以使用注释:

df = pd.read_csv("in.csv",header=None,comment="#")  

如果您需要指定多个字符,则可以结合使用 itertools.takewhile,它将删除以 xxx 开头的行:

import pandas as pd
from itertools import dropwhile
import csv
with open("in.csv") as f:
    f = dropwhile(lambda x: x.startswith("#!!"), f)
    r = csv.reader(f)
    df = pd.DataFrame().from_records(r)

使用您的输入数据添加一些以 #!! 开头的行:

#!! various
#!! metadata
#!! lines
AN,2__AS000,26,20150826113000,-283.000,20150826120000,-283.000
AN,2__A000,26,20150826113000,0.000,20150826120000,0.000
AN,2__AE000,26,20150826113000,-269.000,20150826120000,-269.000
AN,2__AE000,26,20150826113000,-255.000,20150826120000,-255.000
AN,2__AE00,26,20150826113000,-254.000,20150826120000,-254.000

输出:

    0         1   2               3         4               5         6
0  AN  2__AS000  26  20150826113000  -283.000  20150826120000  -283.000
1  AN   2__A000  26  20150826113000     0.000  20150826120000     0.000
2  AN  2__AE000  26  20150826113000  -269.000  20150826120000  -269.000
3  AN  2__AE000  26  20150826113000  -255.000  20150826120000  -255.000
4  AN   2__AE00  26  20150826113000  -254.000  20150826120000  -254.000

@user636322,不用担心,我添加了一些使用read_csv的方法,元数据实际上是什么样子的,你知道有多少行或者这些行以一个常见字符开头吗? - Padraic Cunningham
元数据基本上是整个 CSV 文件中重复的标题信息。我无法预测位置,所以我只使用循环来特定删除(如果行以“xxx”开头)。 - user636322
我实际上是通过循环选择有效数据,因此在上面的示例中消除了无效数据,其中row.startswith('AN')。 - user636322
你可以应用相同的逻辑,只需保留第一个元素以“AN”开头的行,使用生成器表达式即可。 - Padraic Cunningham
字符串拆分得很完美,但如果你的列表还有一个标题行,请使用df.columns = df.iloc[0]将列命名为第一行(索引为0)的内容,然后用df = df[1:]从数据框中删除该标题行。 - undefined
显示剩余2条评论

1
你可以按照以下方式将列表转换为7列数据框:
import pandas as pd

df = pd.read_csv(filename, sep=',')

尝试在您的代码中添加一些描述。它是做什么的?为什么它能工作? - Md.Sukel Ali

-1

我遇到了一个类似的问题。我通过这种方式解决了它。

def lrsplit(line):
    left, *_ , right = line.split('-')
    mid = '-'.join(_)
    return left, mid, right.strip()
example = pd.DataFrame(lrsplit(line) for line in open("example.csv"))
example.columns = ['location', 'position', 'company']

结果:

    location    position    company
0   india   manager intel
1   india   sales-manager   amazon
2   banglore    ccm- head - county  jp morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接