我有数千个项目的数据框 df ,其中“组”列的值重复2到10次。数据框有七列,其中一列名为“ url ”;另一个“标志”。所有这些都是字符串。
我想使用Pandas来遍历这些群体。对于每个组,我想在“ url ”列中找到最长的项目,并在“标记”列中存储“0”或“1”那个项目。我尝试了以下但我不能使它工作。我想1)摆脱下面的循环,2)能够通过df.apply(...)
比较组中的所有项目 all_groups = df["group"].drop_duplicates.tolist()
for item in all_groups:
df[df["group"]==item].apply(lambda x: Here I would like to compare the items within one group)
可以在这种情况下使用apply()和lambda吗?有没有更快的方法来实现这个?
谢谢!
答案 0 :(得分:0)
除非你编写代码并发现它运行缓慢,否则不要对它进行优化。用Donald Knuth的话说。“过早优化是万恶之源。”
如果您想使用default_scrapyd.conf
和apply
(如问题中所述):
lambda
看起来像:
df = pd.DataFrame({'url': ['abc', 'de', 'fghi', 'jkl', 'm'], 'group': list('aaabb'), 'flag': 0})
然后找出哪些元素应该设置它们的标志变量。
flag group url
0 0 a abc
1 0 a de
2 0 a fghi
3 0 b jkl
4 0 b m
请注意,这只会获得第一个具有最大长度的网址。如果您想要不同的行为,可以将网址长度与最大值进行比较。
所以indices = df.groupby('group')['url'].apply(lambda s: s.str.len().idxmax())
df.loc[indices, 'flag'] = 1
现在看起来像是:
df
答案 1 :(得分:0)
Using groupby()
and .transform()
you could do something like:
df['flag'] = df.groupby('group')['url'].transform(lambda x: x.str.len() == x.map(len).max())
Which provides a boolean value for df['flag']
. If you need it as 0
, 1
then just add .astype(int)
to the end.