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'] = abc
或df3.loc[1,'B'] = abc
.
另一个数据帧:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Run Code Online (Sandbox Code Playgroud)
这些插件完美地工作:df.loc[1,'B'] = abc
或df4.loc[1,'B'] = abc
.
Mic*_*ays 86
自从版本0.21.0 以来set_value
已被弃用,您现在应该使用at
.它可以将列表插入到单元格中,而不会ValueError
像loc
那样提高.我认为这是因为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)
rag*_*esz 37
df3.set_value(1, 'B', abc)
适用于任何数据帧.注意列'B'的数据类型.例如.列表不能插入浮点列,在这种情况下df['B'] = df['B'].astype(object)
可以提供帮助.
cs9*_*s95 23
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)
这是因为您的对象是float64
dtype,而列表是object
s,所以那里不匹配。在这种情况下,您要做的就是首先将列转换为对象。
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)
还得到
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 数组和各种东西设置为数据框中的单个单元格值。
归档时间: |
|
查看次数: |
78204 次 |
最近记录: |