[英]Most efficient way to calculate the mean of a group of columns in a pandas DataFrame
我有一個帶有如下列的DataFrame
:
["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"]
我想將各個 A 和 B 列“折疊”在一列中並計算它們的平均值。 簡而言之,在操作結束時,我會得到:
["A", "B"]
其中“A”是所有“A”列的列均值,“B”是所有“B”列的均值。
據我了解, groupby
不適合此任務,或者我使用它不正確:
grouped = data.groupby([item for item in data if "A" not in item])
如果我使用axis=1
,則在調用 mean() 時得到的只是一個空的 DataFrame ,否則我將無法獲得所需的效果。 我想避免構建一個單獨的 DataFrame 以通過迭代來填充手段(例如,通過單獨計算手段然后像new_df["A"] = mean_a
一樣添加它們)。 有沒有有效的解決方案?
您想使用內置的mean()
函數,該函數接受axis
參數來指定逐行均值。 由於您知道您想要的不同方式的特定列名稱約定,因此您可以使用下面的示例代碼非常有效地完成此操作。 在這里,我選擇只創建兩個額外的列,而不是實際銷毀現有數據。 我也可以將這些新列放入一個新的數據框中; 這只是取決於您的需求是什么以及什么對您來說方便。 相同的基本思想在任何一種情況下都適用。
In [1]: import pandas
In [2]: dfrm = pandas.DataFrame([[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]], columns = ['A_1', 'A_2', 'A_3', 'B_1', 'B_2', 'B_3'])
In [3]: dfrm
Out[3]:
A_1 A_2 A_3 B_1 B_2 B_3
0 1 2 3 4 5 6
1 7 8 9 10 11 12
2 13 14 15 16 17 18
In [4]: dfrm["A_mean"] = dfrm[[elem for elem in dfrm.columns if elem[0]=='A']].mean(axis=1)
In [5]: dfrm
Out[5]:
A_1 A_2 A_3 B_1 B_2 B_3 A_mean
0 1 2 3 4 5 6 2
1 7 8 9 10 11 12 8
2 13 14 15 16 17 18 14
In [6]: dfrm["B_mean"] = dfrm[[elem for elem in dfrm.columns if elem[0]=='B']].mean(axis=1)
In [7]: dfrm
Out[7]:
A_1 A_2 A_3 B_1 B_2 B_3 A_mean B_mean
0 1 2 3 4 5 6 2 5
1 7 8 9 10 11 12 8 11
2 13 14 15 16 17 18 14 17
我不知道效率,但我可能會做這樣的事情:
~/coding$ cat colgroup.dat
A_1,A_2,A_3,B_1,B_2,B_3
1,2,3,4,5,6
7,8,9,10,11,12
13,14,15,16,17,18
~/coding$ python
Python 2.7.3 (default, Apr 20 2012, 22:44:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> df = pandas.read_csv("colgroup.dat")
>>> df
A_1 A_2 A_3 B_1 B_2 B_3
0 1 2 3 4 5 6
1 7 8 9 10 11 12
2 13 14 15 16 17 18
>>> grouped = df.groupby(lambda x: x[0], axis=1)
>>> for i, group in grouped:
... print i, group
...
A A_1 A_2 A_3
0 1 2 3
1 7 8 9
2 13 14 15
B B_1 B_2 B_3
0 4 5 6
1 10 11 12
2 16 17 18
>>> grouped.mean()
key_0 A B
0 2 5
1 8 11
2 14 17
我想lambda x: x.split('_')[0]
會更健壯一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.