Извлечение значений индекса DataFrame, которые не плавают в пандах - PullRequest
0 голосов
/ 27 августа 2018

Я работаю с DataFrame, который, как ожидается, будет содержать только значения индекса типа с плавающей запятой, но я подозреваю, что по какой-то причине существуют значения другого типа, в результате чего индекс типа dtype='object'.Я хотел бы извлечь значения индекса, которые не относятся к типу с плавающей запятой, чтобы увидеть, так ли это.

Пример

df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}, index=[0.0,1.5,'a'])

Результатом извлечения в этом случае будетсписок, содержащий один элемент ['a'].

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Вы можете использовать collections.defaultdict для создания словаря типов, сопоставленных со значениями:

from collections import defaultdict

df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [4,5,6,7,8]},
                  index=[0.0,1.5,'a',pd.to_datetime('10/05/2018'),'b'])

vals = pd.to_numeric(df.index, errors='coerce')
idx = df.index[vals.isnull()]

d = defaultdict(list)

for x in idx:
    d[type(x)].append(x)

Затем, например, вы можете использовать d.keys() для извлечения всех нечисловых типов или d[str] для извлечения индексов, которые являются строками.

Результат

print(d)

defaultdict(list,
            {str: ['a', 'b'],
             pandas._libs.tslibs.timestamps.Timestamp: [Timestamp('2018-10-05 00:00:00')]})
0 голосов
/ 27 августа 2018

Хотели бы вы просто выяснить, какие фиктивные данные у вас есть? Если это так, этого достаточно.

df.index[df.index.str[0].notna()]
Index(['a'], dtype='object')

Если у вас есть строковые записи, все, что не является строкой, будет отображаться как NaN.

Если вы хотите избавиться от недействительных данных, попробуйте принудительно заставить их плавать и избавьтесь от NaN-строк.

m = pd.to_numeric(df.index, errors='coerce').notna()  #.notnull()
df[m]
     a  b
0.0  1  4
1.5  2  5
0 голосов
/ 27 августа 2018

С пониманием списка - обновлено на основе рекомендации Coldspeeds:

[x for x in df.index if not isinstance(x, float)]
0 голосов
/ 27 августа 2018

Используйте isinstance с map:

idx = df.index[(df.index.map(lambda x: isinstance(x, float)) == False)]
print (idx)

Index(['a'], dtype='object')
...