将元组添加到pandas数据帧的特定单元格中

时间:2015-01-14 18:12:07

标签: python pandas tuples dataframe

就在我认为自己已经掌握了Python和Pandas的时候,另一个看似简单的问题就出现了。我想将元组添加到pandas数据帧的特定单元格中。这些元组需要根据数据框中其他单元格的内容即时计算 - 换句话说,我不能提前计算所有元组并将它们作为单个数组添加。

例如,我使用一些数据定义数据框并添加几个空列:

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

我可以滚动浏览“新值”的每个单元格。列并添加一个没有问题的整数值:

anyOldValue = 3.5
for i in range(10):
    tempDF.ix[(i,'newValue')] = anyOldValue

print tempDF

但是,如果我尝试添加一个元组,我会收到一条错误消息:

anyOldTuple = (2.3,4.5)
for i in range(10):
    tempDF.ix[(i,'newTuple')] = anyOldTuple

print tempDF

我收到了一些错误消息,包括:

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

...和...

ValueError: setting an array element with a sequence.

我确定我已经在单元格中看到了带有元组(或列表)的数据框架 - 我不是吗?任何有关如何使此代码正常工作的建议将非常感激。

3 个答案:

答案 0 :(得分:10)

您可以使用set_value

tempDF.set_value(i,'newTuple', anyOldTuple)

还要确保该列不是浮点列,例如:

tempDF['newTuple'] = 's' # or set the dtype

否则你会收到错误。

答案 1 :(得分:1)

正如J.Melody所指出的,如果列的dtype为.at[],则.iat[]object可用于将元组分配给单元格。

最小示例:

df initialized as:
   a  b  c
0  0  1  2
1  3  4  5
2  6  7  8

df containing tuple:
   a       b  c
0  0  (1, 2)  2
1  3       4  5
2  6       7  8

代码:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(9).reshape((3,3)), columns=list('abc'), dtype=object)
print('df initialized as:', df, sep='\n')
df.at[0,'b'] = (1,2)
print()
print('df containing tuple:', df, sep='\n')

注意:

如果您跳过, dtype=object,您将得到

ValueError: setting an array element with a sequence.

答案 2 :(得分:0)

不建议使用set_value。

您可以只使用.at []或iat []

例如some_df.at[ idx, col_name] = any_tuple