Замените пустое значение на 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)

Укажите код (например, pd.DataFrame(data)) для создания входного фрейма данных.

Panda Kim 05.08.2024 15:24

обновлено для вас @PandaKim

iBeMeltin 05.08.2024 15:25
{ "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 " } -- он не создает фрейм данных!
PaulS 05.08.2024 15:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
74
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

@BigBen Я обновил его, это кортежи.

iBeMeltin 05.08.2024 15:29

условие отфильтровывает строки из df, содержащие пустые значения, и сохраняет только те строки, в которых они не пусты.

Huzaifa Arshad 05.08.2024 15:33

Есть ли способ добиться этого без преобразования в строковый тип? Мне нужно, чтобы значения были плавающими

iBeMeltin 05.08.2024 17:31

Обновил свой ответ.

Huzaifa Arshad 06.08.2024 18:07

если ваш тип данных — 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)

Другие вопросы по теме