问题
Just when I thought I was getting the hang of Python and Pandas, another seemingly simple issue crops up. I want to add tuples to specific cells of a pandas dataframe. These tuples need to be calculated on-the-fly based on the contents of other cells in the dataframe - in other words, I can't easily calculate all tuples in advance and add them as a single array.
As an example, I define a dataframe with some data and add a couple of empty columns:
import pandas as pd
import bumpy as np
tempDF = pd.DataFrame({'miscdata': [1.2,3.2,4.1,2.3,3.3,2.5,4.3,2.5,2.2,4.2]})
tempDF['newValue'] = np.nan
tempDF['newTuple'] = np.nan
I can scroll through each cell of the 'newValue' column and add an integer value without problems:
anyOldValue = 3.5
for i in range(10):
tempDF.ix[(i,'newValue')] = anyOldValue
print tempDF
However, if I try to add a tuple I get an error message:
anyOldTuple = (2.3,4.5)
for i in range(10):
tempDF.ix[(i,'newTuple')] = anyOldTuple
print tempDF
I've received several error messages including:
ValueError: Must have equal len keys and value when setting with an ndarray
…and…
ValueError: setting an array element with a sequence.
I'm sure I've seen data frames with tuples (or lists) in the cells - haven't I? Any suggestions how to get this code working would be much appreciated.
回答1:
You can use set_value
:
tempDF.set_value(i,'newTuple', anyOldTuple)
Also make sure that the column is not a float column, for example:
tempDF['newTuple'] = 's' # or set the dtype
otherwise you will get an error.
回答2:
set_value is deprecated.
you can just use .at[] or iat[]
e.g. some_df.at[ idx, col_name] = any_tuple
来源:https://stackoverflow.com/questions/27949671/add-a-tuple-to-a-specific-cell-of-a-pandas-dataframe