我需要獲取 Pandas 資料框中包含值 == 1 的所有區域的單元格參考(row#、col#)。
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': [np.nan, 1, np.nan, np.nan, 1],
'y': [np.nan, np.nan, np.nan, np.nan, 1],
'z': [1, np.nan, 1, np.nan, np.nan]})
希望獲得包含兩列的最終資料框: row & col 看起來像:
row col
0 1 1
1 4 1
2 4 2
3 0 3
4 2 3
uj5u.com熱心網友回復:
您可以使用numpy.argwhere.
這應該比使用for回圈df.stack等的所有解決方案快得多。請參閱下面的時間:
In [145]: import numpy as np
In [146]: res = pd.DataFrame(np.argwhere(df.notnull().values).tolist(), columns=['row', 'col'])
In [147]: res.col = res.col 1
In [148]: res
Out[148]:
row col
0 0 3
1 1 1
2 2 3
3 4 1
4 4 2
時間:
np.argwhere:
In [149]: %timeit pd.DataFrame(np.argwhere(df.notnull().values).tolist(), columns=['row', 'col'])
437 μs ± 4.71 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
@sophocles 解決方案使用df.stack:
In [151]: %timeit pd.DataFrame(df[df.notna()].stack().index.tolist(),columns=['row','col'])
1.33 ms ± 5.55 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
uj5u.com熱心網友回復:
您可以使用notna() 來獲取布爾資料幀,并stack()洗掉nan已轉換為False. 抓取index并轉換為串列,以便您可以輕松轉換為 DataFrame。
pd.DataFrame()用正確的列名將其包裝起來可以為您提供所需的內容:
df.columns=[1,2,3]
pd.DataFrame(df[df.notna()].stack().index.tolist(),columns=['row','col'])
row col
0 0 3
1 1 1
2 2 3
3 4 1
4 4 2
uj5u.com熱心網友回復:
您可以遍歷行和列:
res_df = pd.DataFrame(columns=['row', 'col'])
for i in range(len(df)):
for j in range(len(df.columns)):
if df[df.columns[j]].iloc[i] == 1:
res_df = res_df.append({'row': i, 'col': j 1}, ignore_index=True)
print(res_df.sort_values(by='col').reset_index(drop=True))
row col
0 1 1
1 4 1
2 4 2
3 0 3
4 2 3
uj5u.com熱心網友回復:
你可以試試這個:
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': [np.nan, 1, np.nan, np.nan, 1],
'y': [np.nan, np.nan, np.nan, np.nan, 1],
'z': [1, np.nan, 1, np.nan, np.nan]})
list_indexes = []
for idx in range(len(df.columns)):
rows = df.index[df.iloc[:, idx] == 1].tolist()
for row in rows:
list_indexes.append((row, idx 1))
final = pd.DataFrame(list_indexes, columns=['row', 'column'])
print(final)
uj5u.com熱心網友回復:
你可以這樣做:
df.columns=list(range(1,len(df.columns) 1))
1 2 3
0 NaN NaN 1.0
1 1.0 NaN NaN
2 NaN NaN 1.0
3 NaN NaN NaN
4 1.0 1.0 NaN
new_df = df.stack().reset_index().rename(columns = {'level_0':'row', 'level_1':'col'})[['row', 'col']]
row col
0 0 3
1 1 1
2 2 3
3 4 1
4 4 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333436.html
上一篇:如何在熊貓中將字串替換為int?
下一篇:如何根據兩個條件熊貓選擇行
