【问题标题】:Python convert comma separated list to pandas dataframePython将逗号分隔列表转换为熊猫数据框
【发布时间】:2015-11-20 08:37:39
【问题描述】:

我正在努力将逗号分隔的列表转换为多列 (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 列数据框。

提前致谢。

【问题讨论】:

  • 我无法重现您的错误:l=[['AA','2__000',26,20150826113000,-283.000,20150826120000,-283.000],['BB','2__DI9',26,20150826113000,0.000,20150826120000,0.000],[ 'CC','2__GH6',26,20150826113000,-269.000,20150826120000,-269.000]] pd.DataFrame(l) 工作正常
  • 你能把print(mylist)的输出贴出来
  • 我限制了上面的结果,因为它们是 2k 行。数据框是创建的,但是当我打印(df)时,我得到所有数据,然后是 [1922 行 x 1 列]
  • 您能否只发布前几行,您必须显示数据如何存储在您的列表中,以便我们重现您的错误
  • 作为进一步的背景,数据最初来自一个混合了 CSV 数据和一些元数据的文件,我将这些元数据剥离出来并将 CSV 行传递给一个列表。

标签: python csv pandas


【解决方案1】:

您需要拆分列表中的每个字符串:

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 的方法,元数据实际上是什么样的,你知道有多少行或者这些行以一个共同的开头角色?
  • 元数据基本上是在整个 csv 文件中重复头信息。我无法预测位置,所以我只是使用循环来专门删除(如果 row.startswith('xxx'))。
  • @user636322,从csv读取还是可以的,startswith('xxx')中的xxx是什么
  • 我实际上是通过循环选择有效数据,从而消除了无效数据,在上面的示例中为 row.startswith('AN')。
【解决方案2】:

我遇到了类似的问题。我就是这样解决的。

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

【讨论】:

    【解决方案3】:

    您可以通过以下方式将列表转换为 7 列数据框:

    import pandas as pd
    
    df = pd.read_csv(filename, sep=',')
    

    【讨论】:

    • 尝试在您的代码中添加一些描述。是做什么的?为什么有效?
    猜你喜欢
    • 2021-12-06
    • 2020-04-04
    • 2018-06-20
    • 1970-01-01
    • 2021-05-03
    • 2022-01-25
    • 2022-01-19
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多