![](/img/trans.png)
[英]How can I set the value for a specific row for a Pandas DataFrame in a for loop?
[英]In a dataframe in pandas, how can I push the front column value of specific row to the back and fill it with '00' in its place?
data = {'1':['cd','aa','1a'],
'2':['ab','1b'],
'3':['1a']}
想要 output:
data = {'1':['cd','aa','1a'],
'2':['00','ab','1b'],
'3':['00','00','1a]}
所以我解決了如下,但問題是它太慢了。 感謝你的回復
import pandas as pd
for i in (len(data)):
print(i)
count = 0
if ((data['1'].isna())[i]==True):
count = 3
elif ((data['2'].isna())[i]==True):
count = 2
elif ((data['3'].isna())[i]==True):
count = 1
data.loc[i] = data.loc[i].shift(count, fill_value='00')
我的情況有 8 列,這是一個例子
嘗試:
data = {'1':['cd','aa','1a'],
'2':['ab','1b'],
'3':['1a']}
# FOR EACH ITEM, INSERT '00' AT FIRST POSITION
# TILL LENGTH IS ADEQUATE:
for d in data:
while len(data[d]) < 3:
data[d].insert(0, '00')
print(data)
Output:
{'1': ['cd', 'aa', '1a'], '2': ['00', 'ab', '1b'], '3': ['00', '00', '1a']}
您可以在DataFrame上使用 numpy 使用 NA/not-NA 屬性對值進行排序:
data = {'1':['cd','aa','1a'],
'2':['ab','1b'],
'3':['1a']}
df = pd.DataFrame.from_dict(data, orient='index').T
idx = np.argsort(df.notna().to_numpy(), axis=0)
out = (pd.DataFrame(df.to_numpy()[idx, np.arange(df.shape[1])],
columns=df.columns,
index=df.index)
.fillna('00')
)
或者使用 pandas 的apply
,這對於大型數據集來說更短但更慢:
out = (df
.apply(lambda r: r.sort_values(key=pd.notna, ignore_index=True))
.fillna('00')
)
Output:
1 2 3
0 cd 00 00
1 aa ab 00
2 1a 1b 1a
注意。 如果你想要一個字典為 output:
out.to_dict('list')
{'1': ['cd', 'aa', '1a'],
'2': ['00', 'ab', '1b'],
'3': ['00', '00', '1a']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.