簡體   English   中英

如何在具有列表列值列表且某些行具有雙引號作為字符串的csv文件中讀取

[英]How to read in a csv file which has list of list columns values with certain rows having double quotes as strings

附加的csv文件具有4個帶有索引字段的列。

第四列是列表列的列表。 具有一個元素的記錄顯示為列表[13455],具有多個元素的記錄顯示為“ [13764,13455,13456]”。

我想刪除雙引號,並僅將最后一列作為列表列表閱讀。 請建議我如何做。

我也在嘗試從整個列表中找到最大值。

在示例情況下,我試圖找到20930,這是最大值。 示例文件圖像在這里

full_data1 = pd.DataFrame([]) 
   for gm_chunk1 in tqdm_notebook(pd.read_csv('CD_1000.csv',skipinitialspace = True, sep = ',', quotechar='"', usecols = ['ID','NBR','Day','CD'], chunksize=10000)):
      gm_chunk1 = gm_chunk1['CD'].apply(lambda x: x.strip('"'))
      gm_chunk1 = gm_chunk1.groupby(['ID'],as_index=False).agg(lambda x: list(x))
      full_data1 = full_data1.append(gm_chunk1)
      print(len(full_data1))
      print (50*'--')

數據約為1.5億條記錄。 我也在嘗試根據ID進行分組。 該groupby似乎工作正常。 但后來我意識到最后一列變成了所有字符,而不是列表列表。

這是一種可能的解決方案,一旦從CSV創建了DataFrame,就可以將其應用於適用的列:

# Example dataframe:
df = pd.DataFrame(data={"col":[[13455], "[13764,13455,13456]"]})

# Solution
def convert_str(x):
    if isinstance(x, str):
        return eval(x)
    else:
        return x
df["col"] = df["col"].apply(lambda x:convert_str(x))

要獲得最大列表列表,可以使用以下命令:

max(df["col"].apply(lambda l: max(l)))

或僅使用列表理解的替代方法:

max([max(l) for l in df["col"]])

在你的情況下,問題之一是quotechar='"'sep = ',' 。沒有第一,在,在你的名單將被用作分隔符和熊貓將拋出一個錯誤。它將與另一分離器工作的偉大。

使用熊貓:

import pandas as pd
import io
import ast

dframe=u"""0|123|[1]
1|234|"[2,3,4]"
2|345|"[3,4,5]" """

df = pd.read_csv(io.StringIO(dframe), sep='|', header=None)

# The actual solution to apply to the right column
df[2] = df[2].map(lambda x: ast.literal_eval(x))
print(df)

結果

   0    1          2
0  0  123  [1, 2, 3]
1  1  234  [2, 3, 4]
2  2  345  [3, 4, 5]

第三列實際上是您可以迭代的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM