Поиск и возврат строк в фрейме данных Pandas, где есть хотя бы одно значение np.inf - PullRequest
1 голос
/ 23 октября 2019

У меня есть фрейм данных с некоторыми значениями np.inf, и я хотел бы изолировать эти строки там, где появляется np.inf, и проверить их. Однако в кадре данных много столбцов, и его непросто исследовать один за другим, хотя это можно сделать внутри цикла.

Я пробовал это, но не получилось:

rows_with_inf = [df1[column][df1[column] == np.inf] for column in df1.columns if ((df1[column].isin([np.inf])).sum() !=0)]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-94-768652e951ec> in <module>
----> 1 rows_with_inf = [df1[column][df1[column] == np.inf] for column in df1.columns if ((df1[column].isin([np.inf])).sum() !=0)]

<ipython-input-94-768652e951ec> in <listcomp>(.0)
----> 1 rows_with_inf = [df1[column][df1[column] == np.inf] for column in df1.columns if ((df1[column].isin([np.inf])).sum() !=0)]

~\Anaconda3\envs\tf2\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1553             "The truth value of a {0} is ambiguous. "
   1554             "Use a.empty, a.bool(), a.item(), a.any() or a.all().".format(
-> 1555                 self.__class__.__name__
   1556             )
   1557         )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Что быкомпактный («питонический») способ достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Используйте boolean indexing с DataFrame.any для проверки не менее одного np.inf на строки:

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,5,4,5,5,4],
         'C':[7,8,9,4,np.inf,3],
         'D':[1,np.inf,5,7,1,0],
         'E':[5,3,6,9,2,np.inf],
         'F':list('aaabbb')
})



df1 = df[(df == np.inf).any(axis=1)]
print (df1)
   A  B    C    D    E  F
1  b  5  8.0  inf  3.0  a
4  e  5  inf  1.0  2.0  b
5  f  4  3.0  0.0  inf  b

Или, если необходимо, отфильтруйте столбцы, а такжестроки:

m = (df == np.inf)
df2 = df.loc[m.any(axis=1), m.any(axis=0)]
print (df2)

     C    D    E
1  8.0  inf  3.0
4  inf  1.0  2.0
5  3.0  0.0  inf

Подробности :

print (df == np.inf)
       A      B      C      D      E      F
0  False  False  False  False  False  False
1  False  False  False   True  False  False
2  False  False  False  False  False  False
3  False  False  False  False  False  False
4  False  False   True  False  False  False
5  False  False  False  False   True  False

print ((df == np.inf).any(axis=1))
0    False
1     True
2    False
3    False
4     True
5     True
dtype: bool
1 голос
/ 23 октября 2019

Вы можете проверить, является ли любое значение inf для каждой строки.

rows_with_inf = df1[df1.apply(lambda x: any(np.isinf(x)), axis=1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...