Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,使用lambda将空列表添加到dataframe列会引发valueError_Python_Pandas - Fatal编程技术网

在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解决了问题。否