我有一只熊猫数据,格式如下:
col1 col2
0 a A
1 a
2 a A
3 a
4 b
5 b
6 c A
7 c我想搜索col1值,这些值至少具有N对应的col2 == 'A'值。在这种情况下,我希望用col2列中的其他相应单元格填充'A's。
让我们看一个具体的例子。让我们假设N=1。在这种情况下,我们检查col2中是否至少有一个col1值。对于col1='a',col2中有两个'A',因此这种情况符合条件。因此,让我们用col2中的索引1和3填充'A's。接下来,我们看到对于col1='b',col2中没有'A's,因此这里不需要填充任何内容。最后,我们发现对于col1='c',col2中正好有一个'A'。由于这也符合条件,我们将在col2中用'A'填充索引7。
类似地,当N阈值设置为2时,新的'A's只会添加到col2中索引1和3的行,而不会添加到最后一行(索引7)。
我假设可能有一种高效的、矢量化的方法来解决这个问题。现在,我只能考虑迭代dataframe,对于有10s数千行的原始数据集,它不能很好地扩展。
这就是我到目前为止尝试过的。这适用于N=1案例,尽管我没有设法将其推广到任何N阈值,更不用说如何更好地实现它了:
df = df.sort_values(['col1','col2'], ascending=[True,False]).reset_index(drop=True)
for idx, row in df.iloc[1:,:].iterrows():
if df.loc[idx,'col1'] == df.loc[idx-1,'col1'] and df.loc[idx,'col2']=='' and df.loc[idx-1,'col2']!='':
df.loc[idx,'col2'] = df.loc[idx-1,'col2']复制数据的代码:
df = pd.DataFrame(
[['a','A'],['a',''],['a','A'],['a',''],['b',''],['b',''],['c','A'],['c','']],
columns=['col1','col2']
)发布于 2021-12-29 23:22:55
这就是你要找的吗?
N = 1
value = 'A'
df.loc[df.groupby('col1')['col2'].transform(lambda x: sum(x == value) >= N), 'col2'] = value
print(df)
col1 col2
0 a A
1 a A
2 a A
3 a A
4 b
5 b
6 c A
7 c A..。然后和N = 2 ..。
col1 col2
0 a A
1 a A
2 a A
3 a A
4 b
5 b
6 c A
7 c 发布于 2021-12-29 23:58:57
以下是避免lambda函数的解决方案:
N = 1
V = 'A'
df['col2'] = df['col1'].map(df.groupby('col1')['col2'].value_counts().swaplevel()[V].ge(N).map({True:V})).fillna('')输出:
>>> df
col1 col2
0 a A
1 a A
2 a A
3 a A
4 b
5 b
6 c A
7 c Ahttps://stackoverflow.com/questions/70525911
复制相似问题