Python:如何从列表的字典中计算最小值、最大值、中值、第一和第三四分位数?
Python: how to compute min, max, median, 1st and 3rd quartiles from a dict of lists?
假设我有一个这样的列表字典:
mydict={10:[],20:[],30:[],40:[],50:[1],60:[],70:[1],80:[7, 2, 7, 2, 2, 7, 2],90:[5, 2, 2, 6, 2, 3, 1, 2, 1, 2],...}
我想计算:字典中每个列表的最小值、最大值、中值、第一和第三四分位数。我首先尝试了 min
和 max
,如下所示:
mins_mydict={k:min(v) for k,v in mydict.items()}
maxes_mydict={k:max(v) for k,v in mydict.items()}
但我收到此错误:ValueError: min() arg is an empty sequence
。 max
也一样。是因为我的一些列表是空的吗?
如何创建一个检查是否 len(list)=0
的异常?
您遇到错误是因为您在空列表上应用了 min 和 max 方法。
>>> min([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
您的字典包含一些以空列表作为值的键。
您可以为最小值、最大值指定一个默认值。因此,对于空列表,您将收到通知。
>>> min([] or [-1])
-1
你的情况
>>> {k:min(v or [-1]) for k,v in mydict.items()}
{70: 1, 40: -1, 10: -1, 80: 2, 50: 1, 20: -1, 90: 1, 60: -1, 30: -1}
>>> {k:max(v or ["empty list"]) for k,v in mydict.items()}
{70: 1, 40: 'empty list', 10: 'empty list', 80: 7, 50: 1, 20: 'empty list', 90: 6, 60: 'empty list', 30: 'empty list'}
In [4]: mydict={10:[],20:[],30:[],40:[],50:[1],60:[],70:[1],80:[7, 2, 7, 2, 2, 7, 2],90:[5, 2, 2, 6, 2, 3, 1, 2, 1, 2]}
In [5]: import pandas as pd
In [6]: df = pd.DataFrame.from_dict(dict([ (k, pd.Series(v)) for k,v in mydict.items() ]))
In [7]: print(df.min())
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 2.0
90 1.0
dtype: float64
In [8]: df.max()
Out[8]:
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 7.0
90 6.0
dtype: float64
In [9]: df.median()
Out[9]:
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 2.0
90 2.0
dtype: float64
In [10]: df.quantile([.1, .3])
Out[10]:
10 20 30 40 50 60 70 80 90
0.1 NaN NaN NaN NaN 1.0 NaN 1.0 2.0 1.0
0.3 NaN NaN NaN NaN 1.0 NaN 1.0 2.0 2.0
对于 qmaruf 的回答,您可以通过以下方式在列表理解中使用条件:
mins_mydict={k:min(v) if (len(v) > 0) else 0 for k,v in mydict.items()}
要快速查看数据框的计数、平均值、最大值、最小值、标准差和四分位数,您可以使用 df.describe()
假设我有一个这样的列表字典:
mydict={10:[],20:[],30:[],40:[],50:[1],60:[],70:[1],80:[7, 2, 7, 2, 2, 7, 2],90:[5, 2, 2, 6, 2, 3, 1, 2, 1, 2],...}
我想计算:字典中每个列表的最小值、最大值、中值、第一和第三四分位数。我首先尝试了 min
和 max
,如下所示:
mins_mydict={k:min(v) for k,v in mydict.items()}
maxes_mydict={k:max(v) for k,v in mydict.items()}
但我收到此错误:ValueError: min() arg is an empty sequence
。 max
也一样。是因为我的一些列表是空的吗?
如何创建一个检查是否 len(list)=0
的异常?
您遇到错误是因为您在空列表上应用了 min 和 max 方法。
>>> min([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
您的字典包含一些以空列表作为值的键。
您可以为最小值、最大值指定一个默认值。因此,对于空列表,您将收到通知。
>>> min([] or [-1])
-1
你的情况
>>> {k:min(v or [-1]) for k,v in mydict.items()}
{70: 1, 40: -1, 10: -1, 80: 2, 50: 1, 20: -1, 90: 1, 60: -1, 30: -1}
>>> {k:max(v or ["empty list"]) for k,v in mydict.items()}
{70: 1, 40: 'empty list', 10: 'empty list', 80: 7, 50: 1, 20: 'empty list', 90: 6, 60: 'empty list', 30: 'empty list'}
In [4]: mydict={10:[],20:[],30:[],40:[],50:[1],60:[],70:[1],80:[7, 2, 7, 2, 2, 7, 2],90:[5, 2, 2, 6, 2, 3, 1, 2, 1, 2]}
In [5]: import pandas as pd
In [6]: df = pd.DataFrame.from_dict(dict([ (k, pd.Series(v)) for k,v in mydict.items() ]))
In [7]: print(df.min())
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 2.0
90 1.0
dtype: float64
In [8]: df.max()
Out[8]:
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 7.0
90 6.0
dtype: float64
In [9]: df.median()
Out[9]:
10 NaN
20 NaN
30 NaN
40 NaN
50 1.0
60 NaN
70 1.0
80 2.0
90 2.0
dtype: float64
In [10]: df.quantile([.1, .3])
Out[10]:
10 20 30 40 50 60 70 80 90
0.1 NaN NaN NaN NaN 1.0 NaN 1.0 2.0 1.0
0.3 NaN NaN NaN NaN 1.0 NaN 1.0 2.0 2.0
对于 qmaruf 的回答,您可以通过以下方式在列表理解中使用条件:
mins_mydict={k:min(v) if (len(v) > 0) else 0 for k,v in mydict.items()}
要快速查看数据框的计数、平均值、最大值、最小值、标准差和四分位数,您可以使用 df.describe()