Python pandas将列表插入到单元格中

rag*_*esz 80 python list insert dataframe pandas

我有一个列表'abc'和一个数据帧'df':

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN
Run Code Online (Sandbox Code Playgroud)

我想将列表插入单元格1B,所以我想要这个结果:

    A  B
0  12  NaN
1  23  ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

1)如果我使用这个:

df.ix[1,'B'] = abc
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

ValueError: Must have equal len keys and value when setting with an iterable
Run Code Online (Sandbox Code Playgroud)

因为它试图将列表(有两个元素)插入行/列但不插入单元格.

2)如果我使用这个:

df.ix[1,'B'] = [abc]
Run Code Online (Sandbox Code Playgroud)

然后它插入一个只有一个元素是'abc'列表([['foo', 'bar']])的列表.

3)如果我使用这个:

df.ix[1,'B'] = ', '.join(abc)
Run Code Online (Sandbox Code Playgroud)

然后它插入一个字符串:( foo, bar)但不是列表.

4)如果我使用这个:

df.ix[1,'B'] = [', '.join(abc)]
Run Code Online (Sandbox Code Playgroud)

然后它插入一个列表,但它只有一个元素(['foo, bar'])但不是我想要的两个(['foo', 'bar']).

感谢帮助!


编辑

我的新数据框和旧列表:

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'
Run Code Online (Sandbox Code Playgroud)

另一个数据帧:

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]
Run Code Online (Sandbox Code Playgroud)

我想将'abc'列表插入df2.loc[1,'B']和/或df3.loc[1,'B'].

如果数据帧仅包含具有整数值和/或NaN值和/或列表值的列,则将列表插入单元格可以完美地工作.如果数据帧仅包含字符串值和/或NaN值和/或列表值,则将列表插入单元格可以完美地工作.但是,如果数据框具有包含整数和字符串值以及其他列的列,则出现错误消息,如果我使用此:df2.loc[1,'B'] = abcdf3.loc[1,'B'] = abc.

另一个数据帧:

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN
Run Code Online (Sandbox Code Playgroud)

这些插件完美地工作:df.loc[1,'B'] = abcdf4.loc[1,'B'] = abc.

Mic*_*ays 86

2017年更新

自从版本0.21.0 以来set_value已被弃用,您现在应该使用at.它可以将列表插入到单元格中,而不会ValueErrorloc那样提高.我认为这是因为at 始终引用单个值,同时loc可以引用值以及行和列.

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z
Run Code Online (Sandbox Code Playgroud)

  • 我必须确保将原始数据框dtype设置为object才能起作用:df = pd.DataFrame(data,dtype = object) (3认同)
  • 这将返回另一个错误“ ValueError:使用序列设置数组元素”。如果收到错误,请查看@ cs95的答案。 (3认同)

rag*_*esz 37

df3.set_value(1, 'B', abc)适用于任何数据帧.注意列'B'的数据类型.例如.列表不能插入浮点列,在这种情况下df['B'] = df['B'].astype(object)可以提供帮助.

  • 请注意,此命令已被弃用**.下面有一个更新. (5认同)

cs9*_*s95 23

熊猫> = 0.21

set_value已不推荐使用。 现在,您可以使用DataFrame.at按标签设置,以及DataFrame.iat按整数位置设置。

使用at/ 设置单元格值iat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object
Run Code Online (Sandbox Code Playgroud)

如果要将“ B”第二行中的值设置为一些新列表,请使用DataFrane.at

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]
Run Code Online (Sandbox Code Playgroud)

您也可以使用 DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]
Run Code Online (Sandbox Code Playgroud)

如果我得到了ValueError: setting an array element with a sequence怎么办?

我将尝试通过以下方式重现该内容:

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)

这是因为您的对象是float64dtype,而列表是objects,所以那里不匹配。在这种情况下,您要做的就是首先将列转换为对象。

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object
Run Code Online (Sandbox Code Playgroud)

然后,它起作用:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]
Run Code Online (Sandbox Code Playgroud)

可能,但是哈基

更古怪的是,我发现DataFrame.loc如果传递嵌套列表,您可以破解以达到相似的目的。

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]
Run Code Online (Sandbox Code Playgroud)

您可以在此处详细了解其工作原理


小智 8

快速解决问题

只需将列表包含在新列表中,就像下面数据框中对 col2 所做的那样。它起作用的原因是 python 获取外部列表(列表)并将其转换为列,就好像它包含普通标量项一样,在我们的例子中是列表而不是普通标量。

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]
Run Code Online (Sandbox Code Playgroud)


Max*_*eau 7

还得到

ValueError: Must have equal len keys and value when setting with an iterable,

在我的情况下,使用 .at 而不是 .loc 没有任何区别,但强制执行数据帧列的数据类型可以解决问题:

df['B'] = df['B'].astype(object)
Run Code Online (Sandbox Code Playgroud)

然后我可以将列表、numpy 数组和各种东西设置为数据框中的单个单元格值。