【发布时间】:2019-02-12 07:17:18
【问题描述】:
我正在尝试创建一个loop 或更有效的过程,它可以count pandas df 中的当前值的数量。目前我正在选择我想要执行该功能的值。
所以对于下面的df,我试图确定两个counts。
1) ['u'] 返回 ['Code', 'Area'] 中剩余的相同值的计数。那么剩余多少次相同的值出现。
2) ['On'] 返回当前出现在 ['Area'] 中的值的数量。它通过解析df 以查看这些值是否再次出现来实现这一点。因此,它本质上是展望未来,看看这些值是否会再次出现。
import pandas as pd
d = ({
'Code' : ['A','A','A','A','B','A','B','A','A','A'],
'Area' : ['Home','Work','Shops','Park','Cafe','Home','Cafe','Work','Home','Park'],
})
df = pd.DataFrame(data=d)
#Select value
df1 = df[df.Code == 'A'].copy()
df1['u'] = df1[::-1].groupby('Area').Area.cumcount()
ids = [1]
seen = set([df1.iloc[0].Area])
dec = False
for val, u in zip(df1.Area[1:], df1.u[1:]):
ids.append(ids[-1] + (val not in seen) - dec)
seen.add(val)
dec = u == 0
df1['On'] = ids
df1 = df1.reindex(df.index).fillna(df1)
问题是我想对Code 中的所有值运行此脚本。而不是一次选择一个。例如,如果我想在 Code['B'] 上做同样的事情,我将不得不更改:df2 = df1[df1.Code == 'B'].copy() 并再次运行脚本。
如果我在Code 中有很多值,它会变得非常低效。我需要一个loop,它可以在'Code'中找到所有unique值理想情况下,脚本看起来像:
df1 = df[df.Code == 'All unique values'].copy()
预期输出:
Code Area u On
0 A Home 2.0 1.0
1 A Work 1.0 2.0
2 A Shops 0.0 3.0
3 A Park 1.0 3.0
4 B Cafe 1.0 1.0
5 A Home 1.0 3.0
6 B Cafe 0.0 1.0
7 A Work 0.0 3.0
8 A Home 0.0 2.0
9 A Park 0.0 1.0
【问题讨论】:
-
使用
pd.unique有什么问题? -
想要的输出是什么?
-
@朱利安。我不需要
Column中的总unique值。它有点复杂。它遍历并确定“当前”打开的unique值。如,如果稍后出现在df上,它们将被计算在内。如果不是,他们不会。所以['u']是他们出现的次数。['On']是多少人。 -
有多少种不同的面积值?许多?百万?
-
不超过50。
Code一般在5-15之间。但它可以改变哪个是痛苦的部分。所以它可能是ABCDEFGHI一天和ADEGHKLM下一天。如果每次在Code中的值相同,我就会在这些值上运行脚本。
标签: python pandas loops unique