我正在处理一个大型数据集,因此我将创建以下类似的条件:
假设我们正在使用这个数据集:
import pandas as pd
df=pd.DataFrame({'Location': [ 'NY', 'SF', 'NY', 'NY', 'SF', 'SF', 'TX', 'TX', 'TX', 'DC'],
'Class': ['H','L','H','L','L','H', 'H','L','L','M'],
'Address': ['12 Silver','10 Fak','12 Silver','1 North','10 Fak','2 Fake', '1 Red','1 Dog','2 Fake','1 White'],
'Score':['4','5','3','2','1','5','4','3','2','1',]})
所以我希望这些行在 df.Location
中具有唯一值
第一列是每个位置的数据条目数。我可以通过以下方式单独获取:
df[df['Location'] =='SF'].count()['Location']
df[df['Location'] =='NY'].count()['Location']
df[df['Location'] =='TX'].count()['Location']
df[df['Location'] =='DC'].count()['Location']
第二、第三和第四列我想对类(H、L、M)中的不同类型进行求和。我知道我可以通过以下方式做到这一点:
#Second Col for NY
print (df[(df.Location =='NY') & (df.Class=='H')].count()['Class'])
#Third Col for NY
print (df[(df.Location =='NY') & (df.Class=='L')].count()['Class'])
#Fourth Col for NY
print (df[(df.Location =='NY') & (df.Class=='M')].count()['Class'])
我猜这适用于数据透视表,但由于我使用的是数据框,所以一切都混淆了。
对于第五列,我希望合并每个地址的唯一值的数量。例如,在纽约,该值应为 2,因为有两个唯一值和“12 Silver”的重复项
print (df[(df.Location =='NY')].Address)
>>>
0 12 Silver
2 12 Silver
3 1 North
Name: Address, dtype: object
我想这可以通过 groupby
来完成。但我在使用的时候总是感到困惑。我也可以使用.drop_duplicates
然后count
获取数值
如果值小于整数 4,则应为第六列。因此 NY 的值应为
print (df[(df.Location =='NY') & (df.Score.astype(float) < 4)].count()['Score'])
那么制作这样的数据框的好方法是什么?其中行与上述列的位置是唯一的?
它应该看起来像:
Pop H L M HH L4
DC 1 0 0 1 1 1
NY 3 2 1 0 2 2
SF 3 1 2 0 2 1
TX 3 1 2 0 3 2
由于我或多或少知道如何获取每个单独的组件,因此我可以使用 for loop
通过数组,但应该有更简单的方法来做到这一点。
最佳答案
虽然有了足够的堆叠技巧,你也许可以一次性完成这一切,但我认为这不值得。您有一个枢轴操作和一堆分组操作。因此,分别进行它们(这很容易),然后合并结果。
第 1 步是将 Score
设为 float 列;最好在开始处理之前先确定类型。
>>> df["Score"] = df["Score"].astype(float)
然后我们将使用类似 groupby 的列创建一个新框架。我们可以通过传递 .agg
一个字典来做到这一点,但之后我们必须重命名这些列,所以没有多大意义。
>>> gg = df.groupby("Location")
>>> summ = pd.DataFrame({"Pop": gg.Location.count(),
... "HH": gg.Address.nunique(),
... "L4": gg.Score.apply(lambda x: (x < 4).sum())})
>>> summ
HH L4 Pop
Location
DC 1 1 1
NY 2 2 3
SF 2 1 3
TX 3 2 3
[4 rows x 3 columns]
然后我们可以旋转:
>>> class_info = df.pivot_table(rows="Location", cols="Class", aggfunc='size', fill_value=0)
>>> class_info
Class H L M
Location
DC 0 0 1
NY 2 1 0
SF 1 2 0
TX 1 2 0
[4 rows x 3 columns]
并结合:
>>> new_df = pd.concat([summ, class_info], axis=1)
>>> new_df
HH L4 Pop H L M
Location
DC 1 1 1 0 0 1
NY 2 2 3 2 1 0
SF 2 1 3 1 2 0
TX 3 2 3 1 2 0
[4 rows x 6 columns]
您可以根据需要重新排序。
关于python - Pandas 使用计数和条件总结不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21666202/