У меня есть фрейм данных с пустыми значениями в некоторых строках, например:
ID Date Price Curr
A Jan 21 (10,0) USD
B Aug 8 (10,0) USD
C Sep 29 (10,0) USD
settle Aug 24 ( ,)
где последняя строка имеет два пустых значения в столбцах Price
и Curr
.
Как я могу заменить пустые значения на nan, чтобы я мог dropna()
, или удалить строки, содержащие пустые значения, чтобы получить фрейм данных, например:
ID Date Price Curr
A Jan 21 (10,0) USD
B Aug 8 (10,0) USD
C Sep 29 (10,0) USD
образец:
data = {
"ID": ["A", "B", "C", "settle"],
"Date": ["Jan 21", "Aug 8", "Sep 29", "Aug 24"],
"Price": [(10,0), (10,0), (10,0), ()],
"Curr": ["USD", "USD", "USD", ""]
}
df = pd.DataFrame(data)
обновлено для вас @PandaKim
{ "name": "SyntaxError", "message": "invalid syntax (2584679549.py, line 4)", "stack": " Cell In[4], line 4 \"Price\": [(10,0), (10,0), (10,0), ( ,)], ^ SyntaxError: invalid syntax " }
-- он не создает фрейм данных!
Чтобы удалить пустые строки, вы можете попробовать что-то вроде этого:
import pandas as pd
data = {
"ID": ["A", "B", "C", "settle"],
"Date": ["Jan 21", "Aug 8", "Sep 29", "Aug 24"],
"Price": [(10, 0), (10, 0), (10, 0), ()],
"Curr": ["USD", "USD", "USD", ""]
}
df = pd.DataFrame(data)
# Filter out rows where Price is an empty tuple
df = df[df['Price'].apply(lambda x: len(x) > 0)]
# Convert the 'Price' tuples to floats by taking the first element of each tuple
df['Price'] = df['Price'].apply(lambda x: float(x[0]))
print(df)
print(df.dtypes)
# Output
ID Date Price Curr
0 A Jan 21 10.0 USD
1 B Aug 8 10.0 USD
2 C Sep 29 10.0 USD
ID object
Date object
Price float64
Curr object
dtype: object
@BigBen Я обновил его, это кортежи.
условие отфильтровывает строки из df
, содержащие пустые значения, и сохраняет только те строки, в которых они не пусты.
Есть ли способ добиться этого без преобразования в строковый тип? Мне нужно, чтобы значения были плавающими
Обновил свой ответ.
если ваш тип данных — dataframe и сохранен в переменной df:
df.replace('', np.nan, inplace=True)
df.dropna(inplace=True)
df.reset_index(drop=True, inplace=True)
print(df)
Вы можете фильтровать строки, если в каком-либо столбце нет пустых кортежей или пустых значений:
out = df[df[['Price','Curr']].astype(bool).all(axis=1)]
print (out)
ID Date Price Curr
0 A Jan 21 (10, 0) USD
1 B Aug 8 (10, 0) USD
2 C Sep 29 (10, 0) USD
Также возможно установить недостающие значения:
out = df.where(df.astype(bool)).dropna()
print (out)
ID Date Price Curr
0 A Jan 21 (10, 0) USD
1 B Aug 8 (10, 0) USD
2 C Sep 29 (10, 0) USD
Лучшим решением является фильтрация только столбцов со строками и кортежами с помощью DataFrame.select_dtypes, а для проверки пустых строк значения преобразуются в логические значения:
data = {
"ID": ["A", "B", "C", "settle"],
"Date": ["Jan 21", "Aug 8", "Sep 29", "Aug 24"],
"Price": [(10,0), (10,0), (10,0), (),],
"Curr": ["USD", "USD", "USD", ""],
'Val':[1,2,5,6]
}
df = pd.DataFrame(data)
out = df[df.select_dtypes('object').astype(bool).all(axis=1)]
print (out)
0 A Jan 21 (10, 0) USD 1
1 B Aug 8 (10, 0) USD 2
2 C Sep 29 (10, 0) USD 5
Как это работает:
print (df.select_dtypes('object'))
ID Date Price Curr
0 A Jan 21 (10, 0) USD
1 B Aug 8 (10, 0) USD
2 C Sep 29 (10, 0) USD
3 settle Aug 24 ()
print (df.select_dtypes('object').astype(bool))
ID Date Price Curr
0 True True True True
1 True True True True
2 True True True True
3 True True False False
print (df.select_dtypes('object').astype(bool).all(axis=1))
0 True
1 True
2 True
3 False
dtype: bool
df.replace({"": np.nan, "( ,)": np.nan}, inplace=True)
df_clean = df.dropna()
print(df_clean)
Укажите код (например,
pd.DataFrame(data)
) для создания входного фрейма данных.