在python中,使用lambda将空列表添加到dataframe列会引发valueError
我能够在合成数据上重现错误:在python中,使用lambda将空列表添加到dataframe列会引发valueError,python,pandas,Python,Pandas,我能够在合成数据上重现错误: import pandas as pd from datetime import datetime df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': [datetime.now(), datetime.now(), datetime.now(), datetime
import pandas as pd
from datetime import datetime
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': [datetime.now(), datetime.now(), datetime.now(), datetime.now()],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3]);
df2 = pd.DataFrame({'A': ['A1', 'A2', 'A3', 'A4'],
'E': ['E1', 'E2', 'E3', 'E4']},
index=[0,1,2,3]);
df = pd.merge(df1, df2, how='left', on=['A', 'A']);
def getList(row):
r = [];
if row["A"] == "A1": r.append("test-01");
if row["B"] == "B1": r.append("test-02");
if row["B"] == "B2": r.append("test-03");
return r;
df["NEW_COLUMN"] = df.apply(lambda row: getList(row), axis = 1);
原始帖子:我想基于多个条件在pandas dataframe中创建一个新列。新列的值应为list。然而,对于空列表,我得到了“ValueError:指定索引传递的空数据”
def getList(p_row):
r = [];
if p_row["field1"] > 0: r.append("x");
...
return r;
df["new_list_field"] = df.apply(lambda row: getList(row), axis = 1);
完全错误:
ValueError回溯(最近一次调用上次)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
从阵列(阵列、名称、轴)创建块管理器4636尝试:
->4637块=表格块(数组、名称、轴)4638 mgr=块管理器(块、轴)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
如果len(对象项)>0,则形成块(数组、名称、轴)4728:
->4729 object_blocks=_simple_blockify(object_items,np.object_)4730 blocks.extend(object_blocks)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
_简单块化(元组,数据类型)4758“”
->4759个值,位置=_堆栈_数组(元组,数据类型)4760
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
_枚举(数组)中i、arr的堆栈_数组(元组、数据类型)4822:
->4823堆叠[i]=\u asarray\u compat(arr)4824
ValueError:无法将输入数组从形状(2)广播到形状
(195)
在处理上述异常期间,发生了另一个异常:
ValueError回溯(最近一次调用上次)
在()
---->1 df[“新列表\字段”]=df.apply(lambda行:getList(行),axis=1)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in
应用(self、func、axis、broadcast、raw、reduce、args、**kwds)4875
f、 轴,4876减少=减少,
->4877忽略故障=忽略故障)4878其他:4879返回
自应用广播(f轴)
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in
_应用_标准(self、func、axis、ignore_failures、reduce)4988索引=无4989
->4990 result=self.\u构造函数(数据=结果,索引=索引)4991 result.columns=res\u索引4992
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in
init(自身、数据、索引、列、数据类型、副本)
328数据类型=数据类型,复制=复制)
329 elif isinstance(数据、指令):
-->330 mgr=self.\u init\u dict(数据、索引、列、数据类型=dtype)
331 elif isinstance(数据,ma.MaskedArray):
332将numpy.ma.mrecords作为mrecords导入
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in
_init_dict(self、data、index、columns、dtype)
459数组=[k个键的数据[k]
460
-->461将_数组_返回给_mgr(数组、数据名、索引、列、dtype=dtype)
462
463 def_init_ndarray(self、value、index、columns、dtype=None、copy=False):
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\frame.py in
_数组到数组管理器(数组、数组名称、索引、列、数据类型)6171轴=[[确保索引(列),[确保索引(索引)]6172
->6173从阵列(阵列、阵列名称、轴)返回创建块管理器6174 6175
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
从数组(数组、名称、轴)4640创建块管理器
返回mgr 4641,ValueError除外,返回为e:
->4642构造错误(len(数组),数组[0]。形状,轴,e)4643 4644
C:\ProgramData\Anaconda3\lib\site packages\pandas\core\internals.py in
构造错误(总项目、块形状、轴、e)4604如果块形状[0]==0,则升高e 4605: ->4606 raise VALUERROR(“通过指定索引传递的空数据”) 4607 raise VALUERROR(“传递值的形状为{0},索引 暗示{1}.格式(4608通过,暗示)) ValueError:使用指定的索引传递空数据
此函数的输出长度因行而异,但不能将长度不等的列表分配给新列。可以通过以下方式进行验证:
for idx,row in df.iterrows():
print(getList(row))
另一种方法是将输出转换为字符串:
def getListString(row):
r = ''
if row["A"] == "A1": r+="test-01"
if row["B"] == "B1": r+="test-02"
if row["B"] == "B2": r+="test-03"
return r
最后生成列表列表,将其转换为
pd.Series()
并将其分配给新列。字典key2list
将可变长度列表作为值返回:
new_col_list = []
for _, row in my_df.iterrows():
new_col_list.append(key2list[row[u'key']])
my_df[u'new_col'] = pd.Series(new_col_list)
欢迎使用SO!您能否以某种方式提供
数据框
。遗憾的是,无法共享原始数据。这是一个由多个数据源合并而成的百万条记录数据集,包含非常敏感的信息。在两列上有索引。遗憾的是,由于该代码工作正常,因此无法使用示例数据复制它。还尝试创建大数据集切片的副本,但收到相同的错误消息。数据通过odbc来自rdbms,也来自csv文件。使用copy()创建一小块,只保留几个字段。ID int64 PAYMENT\u ID float64 CREDIT\u FL object TRX\u MSG object CALENDAR\u DATE time64[ns]数据类型:对象类型字段应为字符串。带有日历的日期字段引发ValueError回溯(最近一次调用)。如果没有这些字段,它就可以工作。虽然我已经可以用一个简单的条件和int和string类型创建一些字段,但数据类型可能有问题。一个真诚的建议是:您可以尝试在python脚本中不要使用分号吗?它们在python中不做任何事情,不要抛出错误,而是使代码更笨拙……df[“C”]=df['C'].dt.date解决了问题。否