【问题标题】:Export Pandas dataframe to custom CSV format with JSON rows使用 JSON 行将 Pandas 数据框导出为自定义 CSV 格式
【发布时间】:2015-08-04 10:13:10
【问题描述】:

在我的 pandas 程序中,我正在读取 csv 并将一些列转换为 json

例如:我的 csv 是这样的:

id_4 col1  col2 .....................................col100
1     43    56  .....................................67
2     46    67   ....................................78

我想要实现的是:

id_4 json

1  {"col1":43,"col2":56,.....................,"col100":67}
2  {"col1":46,"col2":67,.....................,"col100":78}

我试过的代码如下:

    df = pd.read_csv('file.csv')
    def func(df):         
        d = [
        dict([
        (colname, row[i])        
        for i,colname in enumerate(df[['col1','col2',............,'col100']])

        for row in zip(df['col1'].astype(str),df['col2'].astype(str),...............,df['col100'].astype(str))]

        format_data = json.dumps(d)
        format_data = format_data[1:len(format_data)-1]
        json_data = '{"key":'+format_data+'}' 
        result.append(pd.Series([df['id_4'].unique()[0],json_data],index = headers))                                        
        return df   

    df.groupby('id_4').apply(func)

b = open('output.csv', 'w')
writer = csv.writer(b)
writer.writerow(headers)
writer.writerows(result[1:len(result)])

CSV 包含大约 100 000 个数据,内存为 (15 MB)。当我执行此操作时,经过很长时间该进程会自动终止。我认为这是一个内存问题。

由于我是这个 python 和 pandas 的新手,有没有办法优化上述代码以正常工作或增加内存是唯一的方法。

我使用的是 5GB RAM Linux 系统。

编辑:

df = pd.read_csv('Vill_inter.csv')
with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    for id_4, row in itertools.izip(df.index.values, df.to_dict(orient='records')):
        writer.writerow((id_4, json.dumps(row))

【问题讨论】:

  • ['col1','col2',............,'col100'] 等价于['col'+str(n) for n in range(1, 101)]
  • 没有错误,只是让您知道另一种编写方式,以便在真正的 python 中更简洁地表达相同的东西,而无需任何“速记”符号,例如..........。它还可以帮助清理您的代码。
  • 就错误而言,您的代码示例的括号和大括号不匹配。
  • @Francis Usher 我刚刚粘贴了一段代码。我没有注意到括号和大括号。
  • @Francis Usher 有什么解决方案吗?或任何替代方法来实现结果??

标签: python json csv pandas


【解决方案1】:

Pandas 数据帧可以通过to_json 方法直接在 JSON 中序列化。

你的输出格式不是很清楚,但是看看这个:

# Generate dataframe
df = pd.DataFrame(np.random.randn(5, 100), columns=['col' + str(n) for n in xrange(1, 101)])
# Create id_4 column
df.index += 1
df.index.name = 'id_4'
# Reindex df to have the column id_4 in the output, remove if you only columns1 to X
df.reset_index(drop=False, inplace=True)

# Dump data to disk, or buffer
path = 'out.json'
df.to_json(path, orient='records')

它会比你的循环快得多,并且可能会解决你的错误。

编辑:

显然输出应该是自定义文件格式。在这种情况下,您可以使用to_dict(orient='records) 输出数据帧。输出将是一个列表,其中每个元素将一行表示为字典。您可以使用json 模块(内置)的dumps 函数对字典进行序列化。

类似这样的:

import json
import itertools

with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    for id, row in itertools.izip(df.index.values, df.to_dict(orient='records')):
        writer.writerow((id, json.dumps(row)))

【讨论】:

  • 也可以向该 json 添加密钥
  • 这取决于您是否使用列 id_4 为数据框编制索引。如果你跳过df.reset_index(..) 行,它可以工作。
  • 请不要更改您的要求并尝试理解代码。或问另一个问题。我的回答应该被接受..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多