gpt4 book ai didi

python - 创建 df 或其他数组来计算来自满足特定条件的另一个 df 的条目

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:21 25 4
gpt4 key购买 nike

我有一个当前 df 包含这样的条目:

     date     tags     ease
0 'date1' 'tag1' 1
1 'date1' 'tag1' 2
2 'date1' 'tag1' 1
3 'date1' 'tag2' 2
4 'date1' 'tag2' 2
5 'date2' 'tag1' 3
6 'date2' 'tag1' 1
7 'date2' 'tag2' 1
8 'date2' 'tag3' 1

我想创建一个 df(或者一些其他类型的数组,如果有更好的方法来解决这个问题——我对 Python 很陌生,欢迎提出建议)来计算特定标签具有特定标签的次数简化 df 中的每个日期。例如,如果我想计算每个标签的 ease 为 1 的次数,它看起来像这样:

       date1    date2
tag1 2 1
tag2 1 2
tag3 0 1

我可以想出使用循环执行此操作的方法,但我的最终输出将约为 700 x 800,我需要为每个“缓动”制作一个。我觉得一定有一种有效的方法可以使用索引来做到这一点,因此我首先关注的是 Pandas 。正如我所说,我是 Python 的新手,如果有我应该考虑使用的替代方法或包,我愿意接受。

最佳答案

我想你需要boolean indexingcrosstab :

df1 = df[df['ease'] == 1]
df = pd.crosstab(df1['tags'], df1['date'])
print (df)
date 'date1' 'date2'
tags
'tag1' 2 1
'tag2' 0 1
'tag3' 0 1

另一种解决方案是 crosstab 使用 groupbysize并 reshape unstack :

df = df[df['ease'] == 1].groupby(["date", "tags"]).size().unstack(level=0, fill_value=0)
print (df)
date 'date1' 'date2'
tags
'tag1' 2 1
'tag2' 0 1
'tag3' 0 1

编辑:

经过测试我发布的解决方案是必要的添加功能reindexsort_index ,因为如果过滤非 1 值,它会删除最终 DataFrame 中的行。

print (df[df['ease'] == 1].groupby(["date", "tags"])
.size()
.unstack(level=0, fill_value=0)
.reindex(index=df.tags.unique(), columns=df.date.unique(), fill_value=0)
.sort_index()
.sort_index(axis=1))

还有第二种解决方案:

df1 = df[df['ease'] == 1]
df2 = pd.crosstab(df1['tags'], df1['date'])
.reindex(index=df.tags.unique(), columns=df.date.unique(), fill_value=0)
.sort_index()
.sort_index(axis=1)

时间:

(Psidom 的第二个解在一般 df 中是错误的,所以我从时间上省略了它)

np.random.seed(123)
N = 10000
dates = pd.date_range('2017-01-01', periods=100)
tags = ['tag' + str(i) for i in range(100)]
ease = range(10)
df = pd.DataFrame({'date':np.random.choice(dates, N),
'tags': np.random.choice(tags, N),
'ease': np.random.choice(ease, N)})
df = df.reindex_axis(['date','tags','ease'], axis=1)
#[10000 rows x 3 columns]
#print (df)
print (df.groupby(["date", "tags"]).agg({"ease": lambda x: (x == 1).sum()}).ease.unstack(level=0).fillna(0))

print (df[df['ease'] == 1].groupby(["date", "tags"]).size().unstack(level=0, fill_value=0).reindex(index=df.tags.unique(), columns=df.date.unique(), fill_value=0).sort_index().sort_index(axis=1))

def jez(df):
df1 = df[df['ease'] == 1]
return pd.crosstab(df1['tags'], df1['date']).reindex(index=df.tags.unique(), columns=df.date.unique(), fill_value=0).sort_index().sort_index(axis=1)

print (jez(df))

#Psidom solution
In [56]: %timeit (df.groupby(["date", "tags"]).agg({"ease": lambda x: (x == 1).sum()}).ease.unstack(level=0).fillna(0))
1 loop, best of 3: 1.94 s per loop

In [57]: %timeit (df[df['ease'] == 1].groupby(["date", "tags"]).size().unstack(level=0, fill_value=0).reindex(index=df.tags.unique(), columns=df.date.unique(), fill_value=0).sort_index().sort_index(axis=1))
100 loops, best of 3: 5.74 ms per loop

In [58]: %timeit (jez(df))
10 loops, best of 3: 54.5 ms per loop

关于python - 创建 df 或其他数组来计算来自满足特定条件的另一个 df 的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43426866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com