【问题标题】:Convert a pandas dataframe to tab separated list in Python将熊猫数据框转换为 Python 中的制表符分隔列表
【发布时间】:2021-05-03 02:14:06
【问题描述】:

我有一个如下的数据框:

import pandas as pd
data = {'Words':['actually','he','came','from','home','and','played'], 
        'Col2':['2','0','0','0','1','0','3']}
data = pd.DataFrame(data) 

数据框如下所示:

我使用以下命令将此数据帧写入驱动器:

np.savetxt('/folder/file.txt', data.values,fmt='%s', delimiter='\t')

下一个脚本会使用以下代码行读取它:

data = load_file('/folder/file.txt') 

下面是读取文本文件的 load_file 函数。

def load_file(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        data = f.readlines()
    return data

数据将是一个制表符分隔列表。

print(data)

给我以下输出:

['actually\t2\n', 'he\t0\n', 'came\t0\n', 'from\t0\n', 'home\t1\n', 'and\t0\n', 'played\t3\n']

我不想将文件写入驱动器然后读取它进行处理。相反,我想将数据框转换为制表符分隔的列表并直接处理。我怎样才能做到这一点?
我检查了现有答案,但大多数只是将列表转换为数据框,而不是其他方式。 提前致谢。

【问题讨论】:

  • 可以使用data = load_file(data.to_csv(sep='\t')) 吗?
  • 使用 pandas pd.to_csv(data,sep='\t',index=None)
  • data.to_csv(header=None, index=False, sep='\t').split('\n') ??
  • Python 列表没有分隔符,但逗号用于显示列表。您可以使用制表符和换行符创建一个字符串。你在做什么处理?

标签: python-3.x pandas list dataframe numpy


【解决方案1】:

尝试使用.to_csv()

df_list = data.to_csv(header=None, index=False, sep='\t').split('\n')

df_list:

['actually\t2',
 'he\t0',
 'came\t0',
 'from\t0',
 'home\t1',
 'and\t0',
 'played\t3'
]

v = df.to_csv(header=None, index=False, sep='\t').rstrip().replace('\n', '\n\\n').split('\\n')

df_list:

['actually\t2\n',
 'he\t0\n',
 'came\t0\n',
 'from\t0\n',
 'home\t1\n',
 'and\t0\n',
 'played\t3\n'
]

【讨论】:

  • 感谢@pygirl...正是我需要的:)
  • 我将最后一个元素设为 '' ,因此必须将其删除。不确定您是否遇到过相同的情况,但至少在您上面给出的打印中不可见
  • 实际上我从输出中手动删除了它。是的,我面临同样的事情。因为在最后一行我添加了 \\n.对于最后一个值,应该避免这种情况。您可以创建一个循环来过滤掉空字符串
  • 啊...现在我明白了,逗号终于是我的错误了。但是尽管删除了,我最后还是得到了空元素。像这样的东西。 ['其实\t2\r', '他\t0\r', '来到\t0\r', '来自\t0\r', '家\t1\r', '和\t0\r', '播放\t3\r', '']
  • 对不起。我很着急。更正这是因为最后一行包含\n 解决此问题的一种方法是使用正则表达式,或者您可以使用循环将其过滤掉我将更新我的答案:)
【解决方案2】:

我认为这可以在不写入驱动器的情况下达到相同的结果:

df_list = list(data.apply(lambda row: row['Words'] + '\t' + row['Col2'] + '\n', axis=1))

【讨论】:

  • @Varunkadekar:应避免使用 apply :) 仅供参考。因为它们使性能变慢。 stackoverflow.com/questions/54432583/…
  • 感谢@Pygirl,非常感谢您在这里提出的建议。我的印象是 apply 比 for 循环更好......至少在 R
【解决方案3】:

试试:

data.apply("\t".join, axis=1).tolist()

【讨论】:

  • 感谢 Lambda... 这也有效。只是我最后需要 '\n' 来进行下一组处理。
  • 你可以使用data.apply(lambda x: "\t".join(x)+"\n", axis=1).tolist()
猜你喜欢
  • 2015-11-20
  • 2021-11-27
  • 2019-10-12
  • 2017-08-26
  • 1970-01-01
  • 2019-05-25
  • 2021-12-06
  • 2016-09-25
相关资源
最近更新 更多