我正在尝试创建一个loop
或一个更高效的进程,它可以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
值。理想情况下,脚本如下所示:
预期输出:
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
将
GroupBy
与size
和cumcount
一起使用,可以构造u
系列。在你的逻辑
On
不清楚:这需要澄清。在此过程将您的工作流应用于表中的每个代码:
测试:
^{pr2}$我觉得你的逻辑很混乱。也就是说,我想我可以复制它:
这给了我
^{pr2}$其中,
u
是该行之后匹配(代码、区域)对的数目。nunique是到目前为止在该代码中看到的唯一面积值的数目。 On是到目前为止看到的独特区域的数量,除了一旦我们“用完”一个不再使用的区域,我们就开始从nuniq中减去它。在相关问题 更多 >
编程相关推荐