I have the following problem:
I have a dataframe like this one:
col1 col2 col3
0 2 5 4
1 4 3 5
2 6 2 7
Now I have an array for example a = [5,5,5] and i want to insert this array in col3 but only in specific rows (let's say 0 and 2) and obtain something like that:
col1 col2 col3
0 2 5 [5,5,5]
1 4 3 5
2 6 2 [5,5,5]
The problem is that when I try to do:
zip_df.at[[0,2],'col3'] = a
I receive the following error ValueError: Must have equal len keys and value when setting with an ndarray
. How can I solve this problem?
What you're attempting is not recommended.1 Pandas is not designed to hold list in series. Having said this, you can define a series explicitly and assign via update
or loc
. Note at
is used to get or set a single value only, not multiple values as in your case.
a = [5, 5, 5]
indices = [0, 2]
df['col3'].update(pd.Series([a]*len(indices), index=indices))
# alternative:
# df.loc[indices, 'col3'] = pd.Series([a]*len(indices), index=indices)
print(df)
col1 col2 col3
0 2 5 [5, 5, 5]
1 4 3 5
2 6 2 [5, 5, 5]
1 For more information (source):
Don't do this. Pandas was never designed to hold lists in series / columns. You can concoct expensive workarounds, but these are not
recommended.
The main reason holding lists in series is not recommended is you lose
the vectorised functionality which goes with using NumPy arrays held in contiguous memory blocks. Your series will be of
object
dtype, which represents a sequence of pointers, much like list
. You will lose
benefits in terms of memory and performance, as well as access to optimized Pandas methods.
See also What are the advantages of NumPy over regular Python
lists?
The arguments in favour of Pandas are the same as for NumPy.