将元组添加到 pandas 数据框的特定单元格
Add a tuple to a specific cell of a pandas 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
我可以滚动浏览 'newValue' 列的每个单元格并毫无问题地添加一个整数值:
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.
我确定我已经在单元格中看到了带有元组(或列表)的数据框 - 不是吗?任何有关如何使此代码正常工作的建议都将不胜感激。
您可以使用 set_value
:
tempDF.set_value(i,'newTuple', anyOldTuple)
还要确保该列不是浮点列,例如:
tempDF['newTuple'] = 's' # or set the dtype
否则会报错
set_value 已弃用。
您可以只使用 .at[] 或 iat[]
例如some_df.at[ idx, col_name] = any_tuple
正如 指出的那样,如果列的 dtype 为 object
,.at[]
和 .iat[]
可用于将元组分配给单元格。 =18=]
最小示例:
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.
就在我以为自己掌握了 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
我可以滚动浏览 'newValue' 列的每个单元格并毫无问题地添加一个整数值:
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.
我确定我已经在单元格中看到了带有元组(或列表)的数据框 - 不是吗?任何有关如何使此代码正常工作的建议都将不胜感激。
您可以使用 set_value
:
tempDF.set_value(i,'newTuple', anyOldTuple)
还要确保该列不是浮点列,例如:
tempDF['newTuple'] = 's' # or set the dtype
否则会报错
set_value 已弃用。
您可以只使用 .at[] 或 iat[]
例如some_df.at[ idx, col_name] = any_tuple
正如 最小示例: 代码: 注: 如果您跳过 object
,.at[]
和 .iat[]
可用于将元组分配给单元格。 =18=]
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.