计算pandas d中唯一值的循环

2024-05-20 09:09:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个loop或一个更高效的进程,它可以pandasdf中当前值的数量。现在我正在选择要对其执行函数的值。在

所以对于下面的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值。理想情况下,脚本如下所示:

^{pr2}$

预期输出:

  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

Tags: 脚本loopidsparkdfhomecafeon
3条回答

GroupBysizecumcount一起使用,可以构造u系列。在

你的逻辑On不清楚:这需要澄清。在

g = df.groupby(['Code', 'Area'])
df['u'] = g['Code'].transform('size') - (g.cumcount() + 1)

print(df)

  Code   Area  u
0    A   Home  2
1    A   Home  1
2    B  Shops  1
3    A   Park  1
4    B   Cafe  1
5    B  Shops  0
6    A   Home  0
7    B   Cafe  0
8    A   Work  0
9    A   Park  0

此过程将您的工作流应用于表中的每个代码:

def yourFunc(df1):
    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(df)
    return(df1)

test = df.groupby('Code').apply(yourFunc)

测试:

^{pr2}$

我觉得你的逻辑很混乱。也就是说,我想我可以复制它:

df["u"] = df.groupby(["Code", "Area"]).cumcount(ascending=False)
df["nunique"] = pd.get_dummies(df.Area).groupby(df.Code).cummax().sum(axis=1)
df["On"] = (df["nunique"] - 
           (df["u"] == 0).groupby(df.Code).cumsum().groupby(df.Code).shift().fillna(0)

这给了我

^{pr2}$

其中,u是该行之后匹配(代码、区域)对的数目。nunique是到目前为止在该代码中看到的唯一面积值的数目。 On是到目前为止看到的独特区域的数量,除了一旦我们“用完”一个不再使用的区域,我们就开始从nuniq中减去它。在

相关问题 更多 >