根据 Python 中的另一列筛选列列表
Filter column list based on another column in Python
在 Python 中,我有一个如下所示的数据集,其中 column1
和 column2
是对象而不是字符串:
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
”的值:
一个。也在'column1'
.
b. 'column2'
上的“=”符号后大于零的值(因此,例如,'a2=0'
将从结果中删除,因为是零 (...=0)
,而 a1=8
会保留,因为它是 8 (...=8)
)
因此在这种情况下我的结果是:
data = {'id': ['first_value', 'first_value'],
'column1': ['aO', 'a0;a1'],
'column2': ['a0=4', 'a0=2;a1=8']
}
我怎样才能做到这一点?
对于你的问题,使用循环似乎更容易。从 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
您可以尝试 apply
行
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
在 Python 中,我有一个如下所示的数据集,其中 column1
和 column2
是对象而不是字符串:
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
”的值:
一个。也在'column1'
.
b. 'column2'
上的“=”符号后大于零的值(因此,例如,'a2=0'
将从结果中删除,因为是零 (...=0)
,而 a1=8
会保留,因为它是 8 (...=8)
)
因此在这种情况下我的结果是:
data = {'id': ['first_value', 'first_value'],
'column1': ['aO', 'a0;a1'],
'column2': ['a0=4', 'a0=2;a1=8']
}
我怎样才能做到这一点?
对于你的问题,使用循环似乎更容易。从 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
您可以尝试 apply
行
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