如何在python数据帧中获得不同的值计数
我希望获得python数据帧中不同的值计数,并将结果写入一个新列。这就是我目前所拥有的如何在python数据帧中获得不同的值计数,python,pandas,Python,Pandas,我希望获得python数据帧中不同的值计数,并将结果写入一个新列。这就是我目前所拥有的 import pandas as pd df = pd.DataFrame( { 'OrderNo': [1,1,1,1,2,2,2,3,3], 'Barcode': [1234,2345,3456,3456,1234,1234,2345,1234,3456] } ); df['barcodeCountPerOrderNo'] = df.groupby(['OrderNo', 'Bar
import pandas as pd
df = pd.DataFrame( {
'OrderNo': [1,1,1,1,2,2,2,3,3],
'Barcode': [1234,2345,3456,3456,1234,1234,2345,1234,3456]
} );
df['barcodeCountPerOrderNo'] = df.groupby(['OrderNo', 'Barcode'])['Barcode'].transform('count')
df['distinctBarcodesPerOrderNo'] = '?'
print df
这使得:
Barcode OrderNo barcodeCountPerOrderNo distinctBarcodesPerOrder
0 1234 1 1 ?
1 2345 1 1 ?
2 3456 1 2 ?
3 3456 1 2 ?
4 1234 2 2 ?
5 1234 2 2 ?
6 2345 2 1 ?
7 1234 3 1 ?
8 3456 3 1 ?
但是我怎样才能得到最新的订单呢
Barcode OrderNo barcodeCountPerOrderNo distinctBarcodesPerOrder
0 1234 1 1 3
1 2345 1 1 3
2 3456 1 2 3
3 3456 1 2 3
4 1234 2 2 2
5 1234 2 2 2
6 2345 2 1 2
7 1234 3 1 2
8 3456 3 1 2
您可以使用
nunique
计算每个订单的唯一条形码数量
Barcode_distinct = df.groupby('OrderNo')['Barcode'].nunique()
结果是熊猫系列
> OrderNo
> 1 3
> 2 2
> 3 2
> Name: Barcode, dtype: int64
然后将其与原始数据帧合并
df.merge(Barcode_distinct.to_frame(), left_on='OrderNo', right_index=True, suffixes=('', '_unique_per_OrderNo'))
结果是
> Barcode OrderNo Barcode_unique_per_OrderNo
> 0 1234 1 3
> 1 2345 1 3
> 2 3456 1 3
> 3 3456 1 3
> 4 1234 2 2
> 5 1234 2 2
> 6 2345 2 2
> 7 1234 3 2
> 8 3456 3 2
我将使用
map
获取唯一值,并直接将它们合并到原始数据帧中:
df['distinctBarcodesPerOrder'] = df['OrderNo'].map(df.groupby('OrderNo')['Barcode'].nunique())
返回:
Barcode OrderNo barcodeCountPerOrderNo distinctBarcodesPerOrder
0 1234 1 1 3
1 2345 1 1 3
2 3456 1 2 3
3 3456 1 2 3
4 1234 2 2 2
5 1234 2 2 2
6 2345 2 1 2
7 1234 3 1 2
8 3456 3 1 2
您可以使用
drop\u duplicates
方法。请参阅以下文档了解数据提示:很抱歉,您不清楚如何接收distinctBarcodesPerOrder列。你能澄清一下吗?也许df.distinctBarcodesPerOrder.unique()可以做到这一点吗?这行不通,因为我想知道每个订单的不同条形码计数(df.distinctBarcodesPerOrder.unique()给出整个数据帧的计数)。为了优雅和简单起见。。。这是一个有效且被接受的答案。谢谢!!感谢您是第一个提出有效解决方案的人。我接受了法比奥·拉曼纳的解决方案,因为它稍微短一点。
#If you want a one-liner, you can use apply to get the distinctBarcodesPerOrder for each row. Although this method might be a slow on large dataset.
df['distinctBarcodesPerOrder'] = df.apply(lambda x: df.loc[df.OrderNo==x.OrderNo,'Barcode'].nunique(), axis=1)
df
Out[237]:
Barcode OrderNo barcodeCountPerOrderNo distinctBarcodesPerOrder
0 1234 1 1 3
1 2345 1 1 3
2 3456 1 2 3
3 3456 1 2 3
4 1234 2 2 2
5 1234 2 2 2
6 2345 2 1 2
7 1234 3 1 2
8 3456 3 1 2