我有这个数据框:
iata airport city state country lat \
0 00M Thigpen Bay Springs MS USA 31.953765
1 00R Livingston Municipal Livingston TX USA 30.685861
2 00V Meadow Lake Colorado Springs CO USA 38.945749
3 01G Perry-Warsaw Perry NY USA 42.741347
4 01J Hilliard Airpark Hilliard FL USA 30.688012
我想获得每个州的机场数量。例如,如果我有这个功能:
f(dataframe, state):
result reuslt
州是州的缩写,例如'MA'。我试图通过输入变量对数据帧进行分组,例如状态('MA'),然后获取每个州的机场数。
当我使用时:
df.groupby(state)['airport'].value_counts()
或
df.groupby(state)['airport'].value_counts()/df['airport'].count()
df.groupby(['state'] == state)['airport'].value_counts()/df['airport'].count()
最后两个是关于所选机场将处于该州的条件概率。
它抛出一个键错误:'MA',我认为是由于输入变量未被识别为列,而是列中的值。
有没有办法获得每个州的机场数量?
答案 0 :(得分:1)
假设每条记录都是机场,您只需计算每个州/国家/地区组合的记录:
df.groupby(['country','state']).size()
答案 1 :(得分:1)
我会使用Pandas的nunique
来获取每个州的机场数量。代码更易于阅读和记忆。
为了说明我的观点,我修改了数据集如下,以便佛罗里达州还有三个虚构的机场:
iata airport city state country lat
0 00M Thigpen Bay Springs MS USA 31.953765
1 00R Livingston Municipal Livingston TX USA 30.685861
2 00V Meadow Lake Springs CO USA 38.945749
3 01G Perry-Warsaw Perry NY USA 42.741347
4 01J Hilliard Airpark Hilliard FL USA 30.688012
5 f234 Weirdviller Chilliard FL USA 30.788012
6 23r2 Johnson Billiard FL USA 30.888012
然后,我们写道:
df.groupby('state').iata.nunique()
得到以下结果:
state
CO 1
MS 1
TX 1
FL 3
NY 1
Name: iata, dtype: int64
希望这有帮助。
答案 2 :(得分:0)
您可以将此作为显式组重写:
In [11]: df.groupby("state")["airport"].apply(lambda x: x.value_counts() / len(x))
Out[11]:
state
CO Meadow Lake 1.0
FL Hilliard Airpark 1.0
MS Thigpen 1.0
NY Perry-Warsaw 1.0
TX Livingston Municipal 1.0
Name: airport, dtype: float64
或存储groupby并重复使用它(可能这更快):
In [21]: g = df.groupby("state")["airport"]
In [22]: g.value_counts() / g.size()
Out[22]:
state airport
CO Meadow Lake 1.0
FL Hilliard Airpark 1.0
MS Thigpen 1.0
NY Perry-Warsaw 1.0
TX Livingston Municipal 1.0
Name: airport, dtype: float64
答案 3 :(得分:0)
这似乎按照我的意图在你的帮助下运作。 a[state]
表示状态缩写('MA')形式的输入。这将返回属于该州的随机选择机场的概率。
a = df.groupby('state').iata.nunique()
s = a.sum()
result = a[state]/s
return result