Сколько точек данных нанесено на мой график matplotlib? - PullRequest
0 голосов
/ 09 октября 2019

Итак, я хочу подсчитать количество точек данных, нанесенных на график, чтобы отслеживать общий объем полученных данных. Проблема в том, что моя таблица данных испортила его до уровня, где есть некоторые значения NaN в другой строке по сравнению с другим столбцом, где он может иметь или не иметь значение NaN. Например:

# I use num1 as my y-coordinate and num1-num2 for my x-coordinate.
num1 num2 num3 
1    NaN  25 
NaN  7    45
3    8    63
NaN  NaN  23
5    10   42
NaN  4    44

#So in this case, there should be only 2 data point on the graph between num1 and num2. For num1 and num3, there should be 3. There should be 4 data points between num2 and num3.

Я считаю, что Matplotlib не отображает строки столбца, содержащие значения NaN, начиная с его нуля (пожалуйста, исправьте меня, если я ошибаюсь, я могу сказать это только из-за отсутствия точекнаходясь на координате 0 осей x и y). В начале я думал, что смогу обойтись без использования .count () и найти меньший из двух столбцов и использовать его в качестве моего трекера, но реально это не будет работать, как показано в моем примере выше, потому что это может быть даже МЕНЬШЕчем это, так как один может иметь значение NaN, а другой будет иметь фактическое значение. Некоторые примеры кода, которые я сделал:

# both x and y are columns within the DataFrame and are used to "count" how many data points are # being graphed.
def findAmountOfDataPoints(colA, colB):
    if colA.count() < colB.count():
         print(colA.count())           # Since its a smaller value, print the number of values in colA.
    else: 
         print(colB.count())              # Since its a smaller value, print the number of values in colB.

Кроме того, я подумал об использовании .value_count (), но я не уверен, что это именно та функция, которую я ищу, чтобы завершить то, что я хочу. Любые предложения?

Редактировать 1: Изменены имена фреймов данных, чтобы сделать пример более понятным.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Если я правильно понял вашу проблему, предполагая, что ваша таблица представляет собой пандас-фрейм данных df, следующий код должен работать:

sum((~np.isnan(df['num1']) & (~np.isnan(df['num2']))))

Как это работает:

np.isnanвозвращает True, если ячейка - Nan. ~np.isnan является обратным, следовательно, он возвращает True, если это не Nan.

Код проверяет, где и столбец «num1» И столбец «num2» содержат не-значение Nan, другими словами, он возвращаетИстина для тех строк, где существуют оба значения.

Наконец, эти хорошие строки подсчитываются с помощью sum, что учитывает только значения True.

0 голосов
/ 09 октября 2019

Я так понял, что нужно количество комбинаций точек, которые не NaN. Используя найденную мной функцию, я придумал следующее:

import pandas as pd
import numpy as np

def choose(n, k):
    """
    A fast way to calculate binomial coefficients by Andrew Dalke (contrib).
    /2749143/statistika-kombinatsii-v-python
    """
    if 0 <= k <= n:
        ntok = 1
        ktok = 1
        for t in range(1, min(k, n - k) + 1):
            ntok *= n
            ktok *= t
            n -= 1
        return ntok // ktok
    else:
        return 0


data = {'num1': [1, np.nan,3,np.nan,5,np.nan],
        'num2': [np.nan,7,8,np.nan,10,4],
        'num3': [25,45,63,23,42,44]
        }

df = pd.DataFrame(data)

df['notnulls'] = df.notnull().sum(axis=1)

df['plotted'] = df.apply(lambda row: choose(int(row.notnulls), 2), axis=1)
print(df)
print("Total data points: ", df['plotted'].sum())

С таким результатом:

   num1  num2  num3  notnulls  plotted
0   1.0   NaN    25         2        1
1   NaN   7.0    45         2        1
2   3.0   8.0    63         3        3
3   NaN   NaN    23         1        0
4   5.0  10.0    42         3        3
5   NaN   4.0    44         2        1
Total data points:  9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...