- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在 pandas df
中返回 count
的 unique
值。它是每个行
的累积计数。我的目标是合并一个函数来确定当前在任何时间点出现的值的数量。
import pandas as pd
df = pd.DataFrame({
'A' : ['8:06:00','11:00:00','11:30:00','12:00:00','13:00:00','13:30:00','14:00:00','17:00:00'],
'B' : ['ABC','ABC','DEF','XYZ','ABC','LMN','DEF','ABC'],
'C' : [1,2,1,1,3,1,2,4],
})
A B C
0 8:06:00 ABC 1
1 11:00:00 ABC 2
2 11:30:00 DEF 1
3 12:00:00 XYZ 1
4 13:00:00 ABC 3
5 13:30:00 LMN 1
6 14:00:00 DEF 2
7 17:00:00 ABC 4
因此 col['B']
中有 4 个 unique
值。我正在测量的
df1 = df['B'].nunique()
但我希望通过列
合并迭代
的函数,以确定是否再次出现任何特定值。如果不是,我希望计数减少。如果这是第一次出现该值,我想增加计数。如果该值已经出现并再次出现,则计数应保持不变。这将显示在任何时间点出现了多少个值。
使用@jpp 的代码,我们生成以下内容:
cum_maxer = pd.Series(pd.factorize(df['B'])[0] + 1).cummax()
df['res'] = cum_maxer - df['B'].duplicated().cumsum()
print(df)
输出:
A B C res
0 8:06:00 ABC 1 1
1 11:00:00 ABC 2 0
2 11:30:00 DEF 1 1
3 12:00:00 XYZ 1 2
4 13:00:00 ABC 3 1
5 13:30:00 LMN 1 2
6 14:00:00 DEF 2 1
7 17:00:00 ABC 4 0
'res'
的预期输出
0 1
1 1
2 2
3 3
4 2
5 3
6 2
7 1
本质上,如果 value
第一次出现,我想将它添加到 cumulative count
中。如果该值结束(稍后未出现),则计数应减少。如果值已经出现并再次出现,则计数应保持不变。
每一行的摘要和预期的输出:
第1行
,ABC
第一次出现,之后出现。 计数 = +1
第 2 行
,ABC
再次出现,所以没有增加。它也出现得较晚,所以没有减少。 计数 = 无变化
第3行
,DEF
第一次出现,后来出现。 计数 = +1
第 4 行
,XYZ
第一次出现但后来没有出现。不过此时,出现了 3 个值,因此 count 为 3
。当 XYZ 完成
第 5 行
,如上所述 XYZ
已完成,因此目前只有 ABC
和 DEF
处于打开状态。 ABC
值也再次出现,因此 count 为 2
。
第 6 行
,LMN
首次出现,因此计数增加。这意味着 ABC、DEF、LMN
在该时间点是最新的。与 第 4 行
非常相似,LMN
不会再次出现,因此随着 LMN
完成,计数将在下一行减少。 计数为 3
第 7 行,DEF
和 ABC
当前处于打开状态,因此 计数为 2
。由于 DEF
不再出现,计数将在下一行减少。
第 8 行,ABC
是当前唯一的值,因此 count 是 1
。
最佳答案
你也可以使用np.unique
u = np.unique(df.B, return_index=True)
df['id'] = df.B.map(dict(zip(*u))) + 1
0 1
1 2
2 3
3 1
4 2
5 1
对于您编辑过的问题,这里有一个解决方案。首先,在倒置数据框中使用 cumcount
来预见 future
df['u'] = df[::-1].groupby('B').B.cumcount()
u
表示对于每个 B
,当前 B
在未来出现了多少次。然后,zip
B
和 u
使用您的逻辑,使用 S_n = S_{n-1} + new_value + dec
如果当前 val
是一个新值,并且 dec
是 ,则
如果前一行是该值的最后一次出现(即当时的 new_value
为 True
的标志Trueu==0
)。代码会是这样的
ids = [1]
seen = set([df.iloc[0].B])
dec = False
for val, u in zip(df.B[1:], df.u[1:]):
ids.append(ids[-1] + (val not in seen) - dec)
seen.add(val)
dec = u == 0
df['S'] = ids
A B C u S expected
0 8:06:00 ABC 1 3 1 1
1 11:00:00 ABC 2 2 1 1
2 11:30:00 DEF 1 1 2 2
3 12:00:00 XYZ 1 0 3 3
4 13:00:00 ABC 3 1 2 2
5 13:30:00 LMN 1 0 3 3
6 14:00:00 DEF 2 0 2 2
7 17:00:00 ABC 4 0 1 1
在哪里
>>> (df.S == df.expected).all()
True
df = pd.DataFrame({
'A' : ['8:06:00','11:00:00','11:30:00','12:00:00','13:00:00','13:30:00','14:00:00','17:00:00'],
'B' : ['ABC','ABC','DEF','XYZ','ABC','LMN','DEF','ABC'],
'C' : [1,2,1,1,3,1,2,4],
})
def matt(df):
valsets = df['B'].apply(lambda x: {x})
union_sets = np.frompyfunc(lambda x, y: x | y, 2, 1)
intersect_count = np.frompyfunc(lambda x, y: len(x & y), 2, 1)
seen = union_sets.accumulate(valsets, dtype=np.object)
to_be_seen = union_sets.accumulate(valsets[::-1], dtype=np.object)[::-1]
df['res'] = intersect_count(seen, to_be_seen)
return df
def raf(df):
ids = [1]
seen = set([df.iloc[0].B])
dec = False
df['u'] = df[::-1].groupby('B').B.cumcount()
for val, u in zip(df.B[1:], df.u[1:]):
ids.append(ids[-1] + (val not in seen) - dec)
seen.add(val)
dec = u == 0
df['S'] = ids
return df
df = pd.concat([df]*10000).reset_index()
%timeit matt(df)
168 ms ± 12.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit raf(df)
64.2 ms ± 2.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
关于python - pandas df 中当前唯一值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778723/
pandas.crosstab 和 Pandas 数据透视表似乎都提供了完全相同的功能。有什么不同吗? 最佳答案 pivot_table没有 normalize争论,不幸的是。 在 crosstab
我能找到的最接近的答案似乎太复杂:How I can create an interval column in pandas? 如果我有一个如下所示的 pandas 数据框: +-------+ |
这是我用来将某一行的一列值移动到同一行的另一列的当前代码: #Move 2014/15 column ValB to column ValA df.loc[(df.Survey_year == 201
我有一个以下格式的 Pandas 数据框: df = pd.DataFrame({'a' : [0,1,2,3,4,5,6], 'b' : [-0.5, 0.0, 1.0, 1.2, 1.4,
所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么? 举个例子:数据框1 c1 c2 0 10 100 1 11 110 2 12
TL;DR:在 pandas 中,如何绘制条形图以使其 x 轴刻度标签看起来像折线图? 我制作了一个间隔均匀的时间序列(每天一个项目),并且可以像这样很好地绘制它: intensity[350:450
我有以下两个时间列,“Time1”和“Time2”。我必须计算 Pandas 中的“差异”列,即 (Time2-Time1): Time1 Time2
从这个 df 去的正确方法是什么: >>> df=pd.DataFrame({'a':['jeff','bob','jill'], 'b':['bob','jeff','mike']}) >>> df
我想按周从 Pandas 框架中的列中累积计算唯一值。例如,假设我有这样的数据: df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'week':[1,1,2,1,
数据透视表的表示形式看起来不像我在寻找的东西,更具体地说,结果行的顺序。 我不知道如何以正确的方式进行更改。 df示例: test_df = pd.DataFrame({'name':['name_1
我有一个数据框,如下所示。 Category Actual Predicted 1 1 1 1 0
我有一个 df,如下所示。 df: ID open_date limit 1 2020-06-03 100 1 2020-06-23 500
我有一个 df ,其中包含与唯一值关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,最后一行除外。 下面使用 Label 中的各种字符串值与 Item 相关联.所以对于每个唯一的 Item
考虑以下具有相同名称的列的数据框(显然,这确实发生了,目前我有一个像这样的数据集!:() >>> df = pd.DataFrame({"a":range(10,15),"b":range(5,10)
我在 Pandas 中有一个 DF,它看起来像: Letters Numbers A 1 A 3 A 2 A 1 B 1 B 2
如何减去两列之间的时间并将其转换为分钟 Date Time Ordered Time Delivered 0 1/11/19 9:25:00 am 10:58:00 am
我试图理解 pandas 中的下/上百分位数计算,但有点困惑。这是它的示例代码和输出。 test = pd.Series([7, 15, 36, 39, 40, 41]) test.describe(
我有一个多索引数据框,如下所示: TQ bought HT Detailed Instru
我需要从包含值“低”,“中”或“高”的数据框列创建直方图。当我尝试执行通常的df.column.hist()时,出现以下错误。 ex3.Severity.value_counts() Out[85]:
我试图根据另一列的长度对一列进行子串,但结果集是 NaN .我究竟做错了什么? import pandas as pd df = pd.DataFrame([['abcdefghi','xyz'],
我是一名优秀的程序员,十分优秀!