#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