可重現的資料:
import random
data = {'test_1_a':random.sample(range(1, 50), 7),
'test_1_b':random.sample(range(1, 50), 7),
'test_1_c':random.sample(range(1, 50), 7),
'test_2_a':random.sample(range(1, 50), 7),
'test_2_b':random.sample(range(1, 50), 7),
'test_2_c':random.sample(range(1, 50), 7),
'test_3_a':random.sample(range(1, 50), 7),
'test_4_b':random.sample(range(1, 50), 7),
'test_4_c':random.sample(range(1, 50), 7)}
df = pd.DataFrame(data)
描述:
我有一個類似于上面給出的示例的資料框,其中包含 1000 列。列名格式如下:
test_ number _ family所以 test_1_c 將是一個數字型別 1 和“c”的家庭
我想按相同“家庭”型別的列名對 df 進行分類。所以我的最終輸出需要是相同家庭價值觀的串列:
輸出示例:
[[a_familily 值],[b_familily 值],...]
它也看起來像列的值:
[ [[test_1_a,test_2_a,test_3_a],[test_1_b,test_2_b,test_3_b],...]
是)我有的:
#### transfers data frame into a sorted dict (by column name) by columns as key
col_names = [ i for (i,j) in df.iteritems() ]
col_vals = [ j for (i,j) in df.iteritems() ]
df_dict = dict(zip(col_names, col_vals))
families = np.unique([ i.split("_")[2] for i in dict1.keys() ])
我已將每個列名稱與其關聯的值分類,并提取了我希望在最終輸出中作為“家庭”擁有的唯一數量的組。我現在正在尋求幫助,將資料框分類為與上面給出的輸出示例相同的長度(系列)數量的串列。
我希望我的解釋很清楚,謝謝您的時間!
uj5u.com熱心網友回復:
讓我們跟蹤字典中的不同族,鍵是字母(族),值是保存某個族的列的串列。
由于我們知道每一列都以與其家族相關的字母結尾,我們可以將其用作字典中的鍵。
from collections import defaultdict
families = defaultdict(list)
for col in df.columns:
families[col[-1]].append(df[col])
現在例如,在 中families["a"],我們有:
[0 26
1 13
2 11
3 35
4 43
5 45
6 46
Name: test_1_a, dtype: int64,
0 10
1 15
2 20
3 43
4 40
5 35
6 22
Name: test_2_a, dtype: int64,
0 35
1 48
2 38
3 13
4 3
5 10
6 25
Name: test_3_a, dtype: int64]
我們可以很容易地得到一個每個家庭的資料框concat。
df_a = pd.concat(families["a"], axis=1)
讓我們:
test_1_a test_2_a test_3_a
0 26 10 35
1 13 15 48
2 11 20 38
3 35 43 13
4 43 40 3
5 45 35 10
6 46 22 25
如果我們要為每個家庭創建一個資料框字典,
dfs = {f"df_{fam}" : pd.concat(families[fam], axis=1) for fam in families.keys()}
現在,字典dfs包含:
{'df_a': test_1_a test_2_a test_3_a
0 26 10 35
1 13 15 48
2 11 20 38
3 35 43 13
4 43 40 3
5 45 35 10
6 46 22 25,
'df_b': test_1_b test_2_b test_4_b
0 18 4 44
1 48 43 2
2 30 21 4
3 46 12 16
4 42 14 25
5 22 24 13
6 43 40 43,
'df_c': test_1_c test_2_c test_4_c
0 25 15 5
1 36 39 28
2 6 3 37
3 22 48 16
4 2 34 25
5 39 16 30
6 32 36 2}
uj5u.com熱心網友回復:
您如何看待這樣的方法?pd.wide_to_long與具有拆分列的長資料框的結果一起使用,一個與整個likeclassification一起1_a使用,一個僅與數字一起使用,一個與家庭及其值一起使用。
df = (pd.wide_to_long(
df.reset_index(),stubnames='test_',i='index',j='classification',suffix='\d_\w')
.reset_index()
.drop('index',axis=1)
.rename(columns={'test_':'values'}))
df[['number', 'family']] = df['classification'].str.split('_', expand=True)
df = df.reindex(columns=['classification', 'number', 'family', 'values'])
print(df)
classification number family values
0 1_a 1 a 29
1 1_a 1 a 46
2 1_a 1 a 2
3 1_a 1 a 6
4 1_a 1 a 16
.. ... ... ... ...
58 4_c 4 c 30
59 4_c 4 c 23
60 4_c 4 c 26
61 4_c 4 c 40
62 4_c 4 c 39
易于分組或過濾以進行更多分析。如果您想獲取dicts或獲取lists特定資料,這里有一些示例:
filter1 = df.loc[df['classification']=='1_a',:]
filter2 = df.loc[df['number']=='2','values']
filter1.to_dict(orient='list')
Output:
{'classification': ['1_a', '1_a', '1_a', '1_a', '1_a', '1_a', '1_a'],
'number': ['1', '1', '1', '1', '1', '1', '1'],
'family': ['a', 'a', 'a', 'a', 'a', 'a', 'a'],
'values': [29, 46, 2, 6, 16, 12, 38]}
filter2.tolist()
Output:
[8, 2, 43, 9, 5, 30, 28, 26, 25, 49, 3, 1, 47, 44, 16, 9, 8, 15, 24, 36, 1]
uj5u.com熱心網友回復:
不確定我是否完全理解這個問題;這是你的想法:
dict(list(df.groupby(df.columns.str[-1], axis = 1)))
{'a': test_1_a test_2_a test_3_a
0 20 36 14
1 4 7 16
2 28 13 28
3 3 40 9
4 38 41 5
5 34 47 18
6 49 25 46,
'b': test_1_b test_2_b test_4_b
0 35 10 44
1 46 14 23
2 26 11 36
3 17 27 4
4 13 16 42
5 20 38 9
6 41 22 18,
'c': test_1_c test_2_c test_4_c
0 22 2 26
1 42 24 3
2 15 16 41
3 7 11 16
4 40 37 47
5 38 7 33
6 39 22 24}
這會將列名中最后一個字母的列分組。
如果這不是您的想法,請發表評論,并在我誤解您的意圖的地方更好地解釋一下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/476897.html
上一篇:傳單地圖修改傾斜角度
