簡體   English   中英

在 pandas 的 dataframe 中,如何將特定行的前列值推到后面並在其位置填充“00”?

[英]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']}

您可以在上使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM