基于Python中的另一列的过滤列列表

发布于 2025-01-23 07:21:54 字数 839 浏览 0 评论 0原文

在Python中,我在下面有一个类似的数据集,其中column1column2是对象而不是字符串:

data = {'id':  ['first_value', 'first_value', 'second_value', 'third_value'],
    'column1': [a0, a0 a1, a2, a87],
    'column2': [a0=4, a0=2;a1=8;a7=9, a2=0, a33=9]
    }
    

并且我想保持' column2 < /code>'值

:也位于 'column1' 中。
b。 'column2' 上的“ =”符号之后大于零的值(例如,'a2 = 0'将从结果中删除,因为为零(... = 0),而a1 = 8将留下来,因为它是8 (... = 8)< /code>)

因此,在这种情况下,我的结果是:

data = {'id':  ['first_value', 'first_value'],
        'column1': ['aO', 'a0;a1'],
        'column2': ['a0=4', 'a0=2;a1=8']
        }

我该如何完成?

In Python, I have a dataset like this below, where column1 and column2 are objects and not strings:

data = {'id':  ['first_value', 'first_value', 'second_value', 'third_value'],
    'column1': [a0, a0 a1, a2, a87],
    'column2': [a0=4, a0=2;a1=8;a7=9, a2=0, a33=9]
    }
    

And I want to keep on 'column2' the values that:

a. are also in 'column1'.
b. the values that are bigger than zero after the "=" sign on 'column2' (so, for example, 'a2=0' will be removed from the result because is zero (...=0), while a1=8 will stay because it's 8 (...=8))

Therefore in this case my result would be:

data = {'id':  ['first_value', 'first_value'],
        'column1': ['aO', 'a0;a1'],
        'column2': ['a0=4', 'a0=2;a1=8']
        }

How can I accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

本王不退位尔等都是臣 2025-01-30 07:21:54

您可以在行上尝试应用

def filter_column(row):
    keys = row['column1'].split(' ')
    dicts = dict([kv.split('=') for kv in row['column2'].split(';')])
    lists = [f'{k}={v}' for k, v in dicts.items()
             if k in keys and int(v) > 0]
    return ';'.join(lists)

df['column3'] = df.apply(filter_column, axis=1)
print(df)

             id column1         column2    column3
0   first_value      a0            a0=4       a0=4
1   first_value   a0 a1  a0=2;a1=8;a7=9  a0=2;a1=8
2  second_value      a2            a2=0
3   third_value     a87           a33=9

------------

print(df[df['column3'].ne('')])

            id column1         column2    column3
0  first_value      a0            a0=4       a0=4
1  first_value   a0 a1  a0=2;a1=8;a7=9  a0=2;a1=8

You can try apply on rows

def filter_column(row):
    keys = row['column1'].split(' ')
    dicts = dict([kv.split('=') for kv in row['column2'].split(';')])
    lists = [f'{k}={v}' for k, v in dicts.items()
             if k in keys and int(v) > 0]
    return ';'.join(lists)

df['column3'] = df.apply(filter_column, axis=1)
print(df)

             id column1         column2    column3
0   first_value      a0            a0=4       a0=4
1   first_value   a0 a1  a0=2;a1=8;a7=9  a0=2;a1=8
2  second_value      a2            a2=0
3   third_value     a87           a33=9

------------

print(df[df['column3'].ne('')])

            id column1         column2    column3
0  first_value      a0            a0=4       a0=4
1  first_value   a0 a1  a0=2;a1=8;a7=9  a0=2;a1=8
权谋诡计 2025-01-30 07:21:54

对于您的问题,使用循环似乎更容易。从column1值创建集合,并从column2值创建词典;然后使用zip一起穿越两者,并标识公共密钥,并查看这些密钥下的值是否为零:

out = []
for col1, col2 in zip(({*x.split(';')} for x in df['column1']), 
                      (dict([kv.split('=') for kv in x.split(';')]) for x in df['column2'])):
    inner = []
    s = col2.keys() & col1
    while s:
        k = s.pop()
        if col2[k] != '0':
            inner.append(f"{k}={col2[k]}")
    out.append(';'.join(inner))
df['column2'] = out
out = df[df['column2']!='']

输出:

            id column1    column2
0  first_value      a0       a0=4
1  first_value   a0;a1  a0=2;a1=8

For your problem, it seems easier to use a loop. Create sets from column1 values, and dictionaries from column2 values; then traverse both together using zip and identify common keys and see if the value under those keys are zero or not:

out = []
for col1, col2 in zip(({*x.split(';')} for x in df['column1']), 
                      (dict([kv.split('=') for kv in x.split(';')]) for x in df['column2'])):
    inner = []
    s = col2.keys() & col1
    while s:
        k = s.pop()
        if col2[k] != '0':
            inner.append(f"{k}={col2[k]}")
    out.append(';'.join(inner))
df['column2'] = out
out = df[df['column2']!='']

Output:

            id column1    column2
0  first_value      a0       a0=4
1  first_value   a0;a1  a0=2;a1=8
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文