Как посчитать отсутствие вхождения для каждого значения в данном столбце данных для определенного интервала класса? - PullRequest
1 голос
/ 13 апреля 2020

это мой первый вопрос в stackoverflow.

У меня есть два кадра данных разных размеров df1 (266808 строк) и df2 (201 строк). df1

и

df2

Я хочу добавить количество каждого значения / числа в df1['WS_140m'] в df2['count'] если число попадает в интервал класса, указанный в df2['Class_interval'].

Я пытался

1)

df2['count']=pd.cut(x=df1['WS_140m'], bins=df2['Class_interval'])

2)

df2['count'] = df1['WS_140m'].groupby(df1['Class_interval'])

3)

for anum in df1['WS_140m']:
    if anum in df2['Class_interval']:
        df2['count'] = df2['count'] + 1

Пожалуйста, руководство, если кто-то знает.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Полагаю, что-то вроде этого сделало бы:

In [330]: df1                                                                                                                                                                                               
Out[330]: 
   WS_140m
0     5.10
1     5.16
2     5.98
3     5.58
4     4.81

In [445]: df2                                                                                                                                                                                               
Out[445]: 
   count Class_interval
0      0            NaN
1      0    (0.05,0.15]
2      0    (0.15,0.25]
3      0    (0.25,0.35]
4      0    (3.95,5.15]

In [446]: df2.Class_interval = df2.Class_interval.str.replace(']', ')')

In [451]: from ast import literal_eval
In [449]: for i, v in df2.Class_interval.iteritems(): 
     ...:     if pd.notnull(v): 
     ...:         df2.at[i, 'Class_interval'] = literal_eval(df2.Class_interval[i]) 

In [342]: df2['falls_in_range'] = df1.WS_140m.between(df2.Class_interval.str[0], df2.Class_interval.str[1])                                                                                                 

Вы можете увеличить счет везде, где True, как показано ниже:

In [360]: df2['count'] = df2.loc[df2.index[df2['falls_in_range'] == True].tolist()]['count'] +1                                                                                                             

In [361]: df2                                                                                                                                                                                               
Out[361]: 
   count Class_interval  falls_in_range
0    NaN            NaN           False
1    NaN   (0.05, 0.15)           False
2    NaN   (0.15, 0.25)           False
3    NaN   (0.25, 0.35)           False
4    1.0   (3.95, 5.15)            True
0 голосов
/ 13 апреля 2020

Пожалуйста, попробуйте что-то вроде:


def in_class_interval(value, interval):
    #TODO
def in_class_interval_closure(interval):
   return lambda x: in_class_interval(x, interval)

df2['count'] = df2['Class_interval']
      .apply(lambda x: df1[in_class_interval_closure(x)(df1['WS_140m'])].size,axis=1)

Определите вашу функцию in_class_interval(value, interval), которая возвращает логическое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...