将dataframe列值从numpy.ndarray转换为list

tquggr8v  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(104)

我有一个DataFrame DF,如下所示:
| Sno|值|
| --|--|
| 1 |['h', 'e', 'l', 'o']|
| 2 |['p', 'a', 'r', 'i', 's']|
| 3 |['a', 'm', 'e', 'r', 'i', 'c', 'a']|
当我运行type(df['Values'][0])时,列“Values”的数据类型是numpy.ndarray
我正在尝试将列“Values”的数据类型转换为“list”以执行以下操作:

df[['SNo','Values']].set_index(['SNo']).apply(lambda x: ", ".join(list(x)))

在运行上面的代码时,我得到了错误:

TypeError: sequence item 0: expected str instance, numpy.ndarray found
hgtggwj0

hgtggwj01#

通过展平ND数组来确保没有ND数组,并使用applymap

df[['SNo','Values']].set_index(['SNo']).applymap(lambda x: ", ".join(x.ravel()))

输出量:

Values
SNo                     
1             h, e, l, o
2          p, a, r, i, s
3    a, m, e, r, i, c, a

或者对于单个列:

df.set_index('SNo')['Values'].apply(lambda x: ", ".join(x.ravel()))

输出量:

SNo
1             h, e, l, o
2          p, a, r, i, s
3    a, m, e, r, i, c, a
Name: Values, dtype: object
41zrol4v

41zrol4v2#

您尝试从值创建一个新字符串,而不是list。请尝试:

df["Values"] = df["Values"].apply(list)

print(df)
print(type(df["Values"][0]))

图纸:

SNo                 Values
0    1           [h, e, l, o]
1    2        [p, a, r, i, s]
2    3  [a, m, e, r, i, c, a]

<class 'list'>
q9rjltbz

q9rjltbz3#

你可以使用numpy.char.join()方法代替默认的python方法来连接一个字符到列表。document link

import pandas as pd
import numpy as np

data = {
    'SNo': [1, 2, 3],
    'Values': [
        np.array(['h', 'e', 'l', 'o']),
        np.array(['p', 'a', 'r', 'i', 's']),
        np.array(['a', 'm', 'e', 'r', 'i', 'c', 'a'])
    ]
}

df = pd.DataFrame(data)

df[['SNo','Values']].set_index(['SNo']).apply(lambda x: np.char.join('', x))

结果:
| Sno|值|
| --|--|
| 1 |helo|
| 2 |巴黎|
| 3 |美国|

xmd2e60i

xmd2e60i4#

我想你把df.applySeries.apply弄混了。
df.apply沿轴(默认情况下是按列)沿着应用一个函数,这样你就可以有效地连接一个包含 * 数组 * 的Series(列“Values”),这是不可能的:传递给str.joiniterable 只能包含 strings。因此,您的TypeError:第一个元素(“序列项0”)将是np.array(['h', 'e', 'l', 'o'])
另一方面,Series.apply将函数应用于Series中的 values。例如,它将在单个 * 数组 * 上使用join。这就是我们想要的在join中不需要list,因为数组也是可迭代的。因此,只需首先选择列并应用裸join

df[['SNo','Values']].set_index(['SNo'])['Values'].apply(', '.join)

SNo
1             h, e, l, o
2          p, a, r, i, s
3    a, m, e, r, i, c, a
Name: Values, dtype: object

如果你想创造一个真实的世界:

df[['SNo','Values']].set_index(['SNo'])['Values'].apply(''.join)

SNo
1       helo
2      paris
3    america
Name: Values, dtype: object

设置

data = {'SNo': [1,2,3],
        'Values': [np.array(['h', 'e', 'l', 'o']),
                   np.array(['p', 'a', 'r', 'i', 's']),
                   np.array(['a', 'm', 'e', 'r', 'i', 'c', 'a'])]
        }

df = pd.DataFrame(data)

df

   SNo                 Values
0    1           [h, e, l, o]
1    2        [p, a, r, i, s]
2    3  [a, m, e, r, i, c, a]

相关问题