[英]Pandas dataframe, each cell into list - more pythonic way?
我有一個像這樣的列和行的pandas數據幀:
a b c d
a 40 15 25 35
b 10 25 35 45
c 20 35 45 55
d 40 45 55 65
對於所有大於30的數字,我需要這樣的輸出:
a, a, 40
a, d, 40
b, c, 35
b, d, 45
等等。
目前我正在運行這樣的循環:
for i in df.columns:
for j in df.index:
if df[i][j] > 30:
a.append(i+","+j+","+str(df[i][j])")
這有效,但速度很慢。 是否有更多的pythonic方式來做到這一點?
謝謝!
您可以使用帶有boolean indexing
stack
:
df = df.stack().reset_index()
df.columns = ['a','b','c']
print (df[df.c > 30])
a b c
0 a a 40
3 a d 35
6 b c 35
7 b d 45
9 c b 35
10 c c 45
11 c d 55
12 d a 40
13 d b 45
14 d c 55
15 d d 65
類似方案:
s = df.stack()
df = s[s > 30].reset_index()
df.columns = ['a','b','c']
print (df)
a b c
0 a a 40
1 a d 35
2 b c 35
3 b d 45
4 c b 35
5 c c 45
6 c d 55
7 d a 40
8 d b 45
9 d c 55
10 d d 65
另一種方案:
df1 = df[df > 30].stack().reset_index()
df1.columns = ['a','b','c']
df1.c = df1.c.astype(int)
print (df1)
a b c
0 a a 40
1 a d 35
2 b c 35
3 b d 45
4 c b 35
5 c c 45
6 c d 55
7 d a 40
8 d b 45
9 d c 55
10 d d 65
最后你可以apply
加入:
df['d'] = df.astype(str).apply(', '.join, axis=1)
print (df)
a b c d
0 a a 40 a, a, 40
1 a d 35 a, d, 35
2 b c 35 b, c, 35
3 b d 45 b, d, 45
4 c b 35 c, b, 35
5 c c 45 c, c, 45
6 c d 55 c, d, 55
7 d a 40 d, a, 40
8 d b 45 d, b, 45
9 d c 55 d, c, 55
10 d d 65 d, d, 65
print (df.d.tolist())
['a, a, 40', 'a, d, 35', 'b, c, 35', 'b, d, 45', 'c, b, 35', 'c, c, 45',
'c, d, 55', 'd, a, 40', 'd, b, 45', 'd, c, 55', 'd, d, 65']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.