python-3.x 当list存在于 Dataframe 的单元格中时,从list中移除特定元素

uklbhaso  于 2023-04-22  发布在  Python
关注(0)|答案(5)|浏览(102)

我的dataframe由每个单元格中的列表组成,我想从所有这些列表中删除一个特定的值,而不对整个dataframe使用for循环

TIN        PIN       column       ......

0  [1,2,val]  [0,1]      [val, t, z]  ......
1  [2,val,4]  [14,val]   [b, a, val]  ......
........

这些瓦尔是字符串格式的,我想删除所有这些,它们存在于其中一些列表中,而不存在于其他列表中...
我试过用
.apply(lambda x: x.remove('nan'|'NaT'),因为瓦尔是字符串格式的nan或NaT,即'nan'或'NaT'而不是空值.....
它给了我一个错误说,此外,我认为我的逻辑本身是错误的,因为我认为它是试图删除x,而不是什么是指定的。

umuewwlo

umuewwlo1#

也许这就是你需要的,我使用dataframe方法applymap为dataframe中的所有单元格应用lambda函数,并使用Python filter函数删除变量nan_set中不需要的元素。

nan_set = {'val'}
print(
    df.applymap(lambda arr: list(
        filter(lambda element: element not in nan_set, arr)))
)

输入:

TIN        PIN          COL
0  [1, 2, val]     [0, 1]  [val, t, z]
1  [2, val, 4]  [14, val]  [b, a, val]

输出:

TIN     PIN     COL
0  [1, 2]  [0, 1]  [t, z]
1  [2, 4]    [14]  [b, a]
kx5bkwkv

kx5bkwkv2#

你不能像你想的那样使用remove,因为如果找到了值,它会返回None,如果没有,它会引发ValueError。一种方法是使用嵌套的apply:

df = pd.DataFrame(
    {'TIN': {0: [1,2,'val'], 1: [2,'val',4]},
     'PIN': {0: [0,1], 1: [14,'val']},
     'column': {0: ['val', 't', 'z'], 1: ['b', 'a', 'val']}}
)
df = df.apply(lambda x:x.apply(lambda y:[v for v in y if v != 'val']))

输出:

TIN     PIN  column
0  [1, 2]  [0, 1]  [t, z]
1  [2, 4]    [14]  [b, a]

请注意,从性能方面考虑,最好使用applymap(大约快35%),如@LuanNguyen的回答所述:

df = df.applymap(lambda y:[v for v in y if v != 'val'])

或者使用一组值来删除:

remove = { 'val', 'xyz' }
df = df.applymap(lambda y:[v for v in y if v not in remove])
ctrmrzij

ctrmrzij3#

可以将apply与自定义函数一起使用。
(you可以在一行中完成大部分代码,但很难理解):

Value2Remove='val'

def RemoveVal(Ls,Val):
   if Val in Ls:
       Ls.remove(Val)
   return Ls

df['TIN'] = df['TIN'].apply(lambda x: RemoveVal(x,Value2Remove))
df['PIN'] = df['PIN'].apply(lambda x: RemoveVal(x,Value2Remove))
df['column'] = df['column'].apply(lambda x: RemoveVal(x,Value2Remove))

输入

TIN PIN column
0   [1, 2, val] [0, 1]  [val, t, z]
1   [2, val, 4] [14, val]   [b, a, val]

输出

TIN PIN column
0   [1, 2]  [0, 1]  [t, z]
1   [2, 4]  [14]    [b, a]
mec1mxoz

mec1mxoz4#

您可以使用两个嵌入的“for”循环来实现这一点,一个循环用于遍历df中的单元格,另一个循环用于遍历单元格中的列表元素。

for cell in df["col"]:
    for listitem in cell:
        if listitem < 10:
            list.pop(n)
        else:
            continue

“cell”迭代df单元格,listitems迭代单元格中的列表元素。n表示列表中的第n个元素。IOW如果n = 3,则它将删除列表的第4个元素(记住0是技术上的第一个元素)。

blmhpbnm

blmhpbnm5#

可以通过将每行视为一个系列来使用apply

def remove_nan(s):
    cols = ['TIN', 'PIN', 'column']
    for col in cols:
            try:
                    s[col].remove('nan')
            except ValueError:
                    pass
    return s

将其应用于df,将轴设置为1,以便在列上执行操作

df_text = df.apply(remove_nan, axis=1)

print(df_text)
TIN     PIN  column
0  [1, 2]  [0, 1]  [t, z]
1  [2, 4]    [14]  [b, a]

相关问题