Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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 若列中列表中的项是字典键,则替换为值,若不在字典中,则删除_Python_Pandas - Fatal编程技术网

Python 若列中列表中的项是字典键,则替换为值,若不在字典中,则删除

Python 若列中列表中的项是字典键,则替换为值,若不在字典中,则删除,python,pandas,Python,Pandas,如果列包含列表,则可以使用字典使用 df['listColumn'] = df['listColumn'].apply(lambda x: [columnDictionary[i] for i in x]) 但是,在某些情况下,列表中的项目并非都是字典的键。在这种情况下,如何将这些项目替换为零 比如说 columnDictionary = {a:1, b:2, d:7, f:8 } 特定行/列:[a、b、c、d、e] 转换后的特定行/列:[1、2、7]有一个内置函数来检查某个内容是否为列表,

如果列包含列表,则可以使用字典使用

df['listColumn'] = df['listColumn'].apply(lambda x: [columnDictionary[i] for i in x])
但是,在某些情况下,列表中的项目并非都是字典的键。在这种情况下,如何将这些项目替换为零

比如说

columnDictionary = {a:1, b:2, d:7, f:8 }
特定行/列:[a、b、c、d、e]


转换后的特定行/列:[1、2、7]

有一个内置函数来检查某个内容是否为列表,它称为isinstance(mydata,list)它将分别返回True或False。

有一个内置函数来检查某个内容是否为列表,它称为isinstance(mydata,list)whitch将分别返回True或False。

在lamdba函数中使用“if-else”:

方法1:在列上应用lambda,下面仅在一列上应用lambda(轴=0)

方法2:在行(轴=1)上应用lambda,逐行(我认为速度较慢)

结果:

    col1    listColumn
0   a   [1]
1   b   [2]
2   c   []
3   d   [7]
4   e   []
在lamdba函数中使用“if else”:

方法1:在列上应用lambda,下面仅在一列上应用lambda(轴=0)

方法2:在行(轴=1)上应用lambda,逐行(我认为速度较慢)

结果:

    col1    listColumn
0   a   [1]
1   b   [2]
2   c   []
3   d   [7]
4   e   []

使用简单条件检查列表值是否在目标dict keys list中:

In [47]: df = pd.DataFrame({'listColumn': ['a', 123, list('abcde')]})                                           

In [48]: repl_dict = {'a':1, 'b':2, 'd':7, 'f':8 }                                                              

In [49]: df['listColumn'].apply(lambda x: [repl_dict[v] for v in x if v in repl_dict] if isinstance(x, list) else x)                                                                                                   
Out[49]: 
0            a
1          123
2    [1, 2, 7]
Name: listColumn, dtype: object

使用简单条件检查列表值是否在目标dict keys list中:

In [47]: df = pd.DataFrame({'listColumn': ['a', 123, list('abcde')]})                                           

In [48]: repl_dict = {'a':1, 'b':2, 'd':7, 'f':8 }                                                              

In [49]: df['listColumn'].apply(lambda x: [repl_dict[v] for v in x if v in repl_dict] if isinstance(x, list) else x)                                                                                                   
Out[49]: 
0            a
1          123
2    [1, 2, 7]
Name: listColumn, dtype: object

虽然这更容易阅读,但不知何故,这会耗尽我系统中的所有ram,并需要一段时间才能完成操作,而另一种解决方案需要几秒钟的时间ram@SantoshGupta7,我编辑了我的答案,并添加了另一个将Lambda应用于列而不是行的方法。我想会更快。我会检查性能,如果发现其他问题,会通知您。虽然这更容易阅读,但不知何故,这会占用我系统中的所有ram,并需要一段时间才能完成操作,而另一种解决方案需要几秒钟的时间ram@SantoshGupta7,我编辑了我的答案并添加了另一个方法,该方法将Lambda应用于列而不是行。我想会更快。我会检查性能,如果发现其他问题,会告诉你。我把答案换成了这个。另一个更容易阅读,但我注意到它需要很长时间才能运行,并且会消耗掉我所有的内存,而你的答案需要几秒钟才能运行,并且不会消耗掉内存。知道为什么吗?我把答案换成了这个。另一个更容易阅读,但我注意到它需要很长时间才能运行,并且会消耗掉我所有的内存,而你的答案需要几秒钟才能运行,并且不会消耗掉内存。知道为什么吗?