使用.apply()来比较元素

时间:2017-08-08 21:54:51

标签: python pandas

我有数千个项目的数据框 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吗?有没有更快的方法来实现这个?

谢谢!

2 个答案:

答案 0 :(得分:0)

除非你编写代码并发现它运行缓慢,否则不要对它进行优化。用Donald Knuth的话说。“过早优化是万恶之源。”

如果您想使用default_scrapyd.confapply(如问题中所述):

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.