Pandas - 检查列中的数字是不是在行中
Posted
技术标签:
【中文标题】Pandas - 检查列中的数字是不是在行中【英文标题】:Pandas - Check if Numbers in Column are in rowPandas - 检查列中的数字是否在行中 【发布时间】:2018-09-03 09:45:51 【问题描述】:我有一个熊猫数据框如下:
user_id product_id order_number
1 1 1
1 1 2
1 1 3
1 2 1
1 2 5
2 1 1
2 1 3
2 1 4
2 1 5
3 1 1
3 1 2
3 1 6
我想查询这个 df 最长的连续(没有 order_number 被跳过)和最后的连续(因为最后一个 order_number)。
理想的结果如下:
user_id product_id longest_streak last_streak
1 1 3 3
1 2 0 0
2 1 3 3
3 1 2 0
我将不胜感激。
【问题讨论】:
为什么last_streak
的第一行是 3?没有以前的历史记录,所以你不希望它是 0 吗?
last_streak 从最后一个订单号开始统计行中的订单数。
@DyZ,在那篇文章中,连续意味着重复,而不是后续。这个有点不同。
另外,您是否希望用户稍后在DataFrame
中重复 user_id 和 product_id 组合?如果是这样,您希望如何区分它属于不同的条纹?只是按索引?
@ALollz 不,我不希望 user_id 和 product_id 在属于不同的条纹时重复。 user_id 和 product_id 的组合在结果数据框中必须是唯一的。
【参考方案1】:
我仍然不太清楚你是如何定义last_streak
的,但是,假设用户和产品的相同组合不重复,以下计算最长条纹:
import itertools
def extract_streaks(data):
streaks = [len(list(rows)) for d,rows in itertools.groupby(data) if d==1.0]
return max(streaks) + 1 if streaks else 0
df['diffs'] = df.order_number.diff()
df.groupby(['user_id', 'product_id'])['diffs'].apply(extract_streaks)
#user_id product_id
#1 1 3
# 2 0
#2 1 3
【讨论】:
【参考方案2】:你可以试试
s=df.assign(key=1).set_index(['user_id','product_id','order_number']).key.unstack() s=s.notnull().astype(int).diff(axis=1).fillna(0).ne(0).cumsum(axis=1).mask(s.isnull())
s=s.apply(pd.value_counts,1)
s=s.mask(s==1,0)
pd.concat([s.max(1),s.ffill(axis=1).iloc[:,-1]],1)
Out[974]:
0.0 2.0
user_id product_id
1 1 3.0 3.0
2 0.0 0.0
2 1 3.0 3.0
【讨论】:
【参考方案3】:带有循环和defaultdict
a = defaultdict(lambda:None)
longest = defaultdict(int)
current = defaultdict(int)
for i, j, k in df.itertuples(index=False):
if a[(i, j)] == k - 1:
current[(i, j)] += 1 if current[(i, j)] else 2
longest[(i, j)] = max(longest[(i, j)], current[(i, j)])
else:
current[(i, j)] = 0
longest[(i, j)] |= 0
a[(i, j)] = k
pd.concat(
[pd.Series(d) for d in [longest, current]],
axis=1, keys=['longest_streak', 'last_streak']
).rename_axis(['user_id', 'product_id']).reset_index()
user_id product_id longest_streak last_streak
0 1 1 3 3
1 1 2 0 0
2 2 1 3 3
3 3 1 2 0
【讨论】:
以上是关于Pandas - 检查列中的数字是不是在行中的主要内容,如果未能解决你的问题,请参考以下文章
如何检查一系列字符串是不是包含在 PANDAS DataFrame 列中并将该字符串分配为行中的新列?
检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas