Замените пустое значение на nan в фрейме данных

У меня есть фрейм данных с пустыми значениями в некоторых строках, например:

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)

🤔 А знаете ли вы, что...
С Python можно создавать ботов для социальных сетей и мессенджеров.


2
74
4

Ответы:

Решено

Чтобы удалить пустые строки, вы можете попробовать что-то вроде этого:

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

если ваш тип данных — dataframe и сохранен в переменной df:

преобразовать пустое значение в NaN

df.replace('', np.nan, inplace=True)

Удаление строк со значениями NaN

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

Замените пустые значения на NaN

df.replace({"": np.nan, "(   ,)": np.nan}, inplace=True)

Удаление строк со значениями NaN

df_clean = df.dropna()

Отобразить очищенный DataFrame

print(df_clean)