从panda datafram中删除方括号

2024-04-25 22:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个需要去掉方括号的数据帧,以便输入到循环中。你知道吗

我试过用str.strip公司以及str.命令. 但是,我得到的错误是,我必须传递一个带有布尔值的数据帧。我的数据框中的值似乎是列表。你知道吗

m2 = pd.read_csv('newm2.csv', sep=',s', header=None)
print m2

样本输入:

m2 = pd.DataFrame([
    [[14,38,51,65,84,85]],
    [[3,34,58,65,66,75]],
    [[3,15,68,70,80,82]],
    [[19,31,42,50,54,97]],
    [[4,9,48,62,74,77]],
])
                         0
0      [14,38,51,65,84,85]
1       [3,34,58,65,66,75]
2       [3,15,68,70,80,82]
3      [19,31,42,50,54,97]
4        [4,9,48,62,74,77]

上面是一个小例子,它目前正在打印。我需要每一行看起来像:

"14,38,51,65,84,85"

我该怎么解决这个问题?你知道吗


Tags: csv数据命令列表read错误公司sep
3条回答

一种简单的方法是将list转换为str

x = [
    [[14,38,51,65,84,85]],
    [[3,34,58,65,66,75]],
    [[3,15,68,70,80,82]],
    [[19,31,42,50,54,97]],
    [[4,9,48,62,74,77]],
]

m2 = pd.DataFrame(x)
m2[0] = m2[0].apply(lambda x: ','.join([str(i) for i in x]))

m2
Out[1]:
        0
0      '14,38,51,65,84,85'
1      '3,34,58,65,66,75'
2      '3,15,68,70,80,82'
3      '19,31,42,50,54,97'
4       '4,9,48,62,74,77'

编辑

如果行的类型是str,而实际上不是list,该怎么办。我们只是将它们转换为literal str,然后执行.join

from ast import literal_eval

x = [
    ['[14,38,51,65,84,85]'],
    ['[3,34,58,65,66,75]'],
    ['[3,15,68,70,80,82]'],
    ['[19,31,42,50,54,97]'],
    ['[4,9,48,62,74,77]'],
]

m2 = pd.DataFrame(x)

m2[0] = m2[0].apply(lambda x: ','.join([str(i) for i in literal_eval(x)]))
m2
Out[1]:
        0
0      '14,38,51,65,84,85'
1      '3,34,58,65,66,75'
2      '3,15,68,70,80,82'
3      '19,31,42,50,54,97'
4       '4,9,48,62,74,77'

作为

a = [1,2,3,4]

你可以的

b = str(a) # out: '[1,2,3,4]'

避免“[”和“]”

b = str(a)[1:-1] # out: '1,2,3,4'

所以,我们只需要将它应用于数组m2[0]中的每个数组

import pandas as pd

m2 = pd.DataFrame([
    [[14,38,51,65,84,85]],
    [[3,34,58,65,66,75]],
    [[3,15,68,70,80,82]],
    [[19,31,42,50,54,97]],
    [[4,9,48,62,74,77]],
])

m2[0] = m2[0].apply(lambda x: str(x)[1:-1])

print(m2[0])

输出:

0    14, 38, 51, 65, 84, 85
1     3, 34, 58, 65, 66, 75
2     3, 15, 68, 70, 80, 82
3    19, 31, 42, 50, 54, 97
4      4, 9, 48, 62, 74, 77

我会避免apply,因为它的性能较差。这是另一种方法。你知道吗

m2 = pd.DataFrame([
    [[14,38,51,65,84,85]],
    [[3,34,58,65,66,75]],
    [[3,15,68,70,80,82]],
    [[19,31,42,50,54,97]],
    [[4,9,48,62,74,77]],
])
m2.iloc[:, 0] = m2.iloc[:, 0].astype(str)
m2.iloc[:, 0] = ['"' + x.strip('[').strip(']').replace(' ','') + '"' for x in m2.iloc[:, 0]]
m2

输出:

                0
0   "14,38,51,65,84,85"
1   "3,34,58,65,66,75"
2   "3,15,68,70,80,82"
3   "19,31,42,50,54,97"
4   "4,9,48,62,74,77"

相关问题 更多 >