Python: удалить все данные в столбце фрейма данных и сохранить последнее значение в первой строке

#python #pandas #numpy #dataframe

#python #pandas #numpy #фрейм данных

Вопрос:

Допустим, у меня есть простой фрейм данных.

 import pandas as pd

data1 = [12,34,'fsdf',678,'','','dfs','','']
df1 = pd.DataFrame(data1, columns= ['Data'])
print(df1)

   Data
0    12
1    34
2  fsdf
3   678
4
5
6   dfs
7
8
  

Я хочу удалить все данные, кроме последнего значения, найденного в столбце, которое я хочу сохранить в первой строке. Это может быть столбец с тысячами строк. Итак, я хотел бы получить результат :

    Data
0   dfs
1   
2  
3  
4
5
6  
7
8
  

И я должен сохранить форму этого фрейма данных, поэтому не удаляю строки.

Какие простейшие функции позволяют сделать это эффективно?

Спасибо

Ответ №1:

Получить индекс последнего непустого строкового значения и перейти к первому значению столбца:

 s = df1.loc[df1['Data'].iloc[::-1].ne('').idxmax(), 'Data']
print (s)
dfs

df1['Data'] = ''
df1.loc[0, 'Data'] = s
print (df1)
  Data
0  dfs
1     
2     
3     
4     
5     
6     
7     
8    
  

Если в пустых строках отсутствуют значения:

 data1 = [12,34,'fsdf',678,np.nan,np.nan,'dfs',np.nan,np.nan]
df1 = pd.DataFrame(data1, columns= ['Data'])
print(df1)
   Data
0    12
1    34
2  fsdf
3   678
4   NaN
5   NaN
6   dfs
7   NaN
8   NaN

s = df1.loc[df1['Data'].iloc[::-1].notna().idxmax(), 'Data']
print (s)
dfs

df1['Data'] = ''
df1.loc[0, 'Data'] = s
print (df1)
  Data
0  dfs
1     
2     
3     
4     
5     
6     
7     
8    
  

Ответ №2:

Простая проверка состояния pandas, подобная этой, может помочь,

 df1['Data'] = [df1.loc[df1['Data'].ne(""), "Data"].iloc[-1]]   [''] * (len(df1) - 1)
  

Ответ №3:

Вы можете заменить '' с NaN помощью df.replace , теперь используйте df.last_valid_index

 val = df1.loc[df1.replace('', np.nan).last_valid_index(), 'Data']

# Below two lines taken from @jezrael's answer
df1.loc[0, 'Data'] = val
df1.loc[1:, 'Data'] = ''
  

Или

Вы можете использовать np.full с fill_value set to np.nan здесь .

 val = df1.loc[df1.replace("", np.nan).last_valid_index(), "Data"]
df1 = pd.DataFrame(np.full(df1.shape, np.nan), 
                   index=df.index,
                   columns=df1.columns)

df1.loc[0, "Data"] = val