Сравнить смещенные столбцы серии Pandas - PullRequest
1 голос
/ 02 октября 2019

Сравнение 2 серийных объектов разных размеров:

IN[248]:df['Series value 1']
Out[249]: 
0     70
1     66.5
2     68
3     60
4     100
5     12
Name: Stu_perc, dtype: int64

IN[250]:benchmark_value 
#benchamrk is a subset of data from df2 only based on certain filters
Out[251]: 
0    70
Name: Stu_perc, dtype: int64

По сути, я хочу сравнить df ['Series value 1'] с benchmark_value и вернуть значения, превышающие 95% от эталонного значения вСписок соответствия столбцов. Тип обоих из них - серия Панд. Однако размеры отличаются для обоих, следовательно, это не сравнение.

Введено:

IN[252]:df['Matching list']=(df2['Series value 1']>=0.95*benchmark_value)
OUT[253]: ValueError: Can only compare identically-labeled Series objects

Требуется вывод:

 [IN]:
 df['Matching list']=(df2['Stu_perc']>=0.95*benchmark_value)
 #0.95*Benchmark value is 66.5 in this case.

 df['Matching list']
 [OUT]:
0     70
1     66.5
2     68
3     NULL
4     100
5     NULL

Ответы [ 3 ]

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

ваше контрольное значение однозначное?

Если да, вам может потребоваться преобразовать benchmark_value, представляющий собой серию, в число (без индекса) с помощью df['Matching list']=(df['Stu_perc']>=0.95*benchmark_value.values)

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

Поскольку значение_маркетинга равно Series, для скалярной необходимости выберите первое значение Series с помощью Series.iat и установите NaN с с помощью Series.where:

benchmark_value = pd.Series([70], index=[0])

val = benchmark_value.iat[0]
df2['Matching list']= df2['Stu_perc'].where(df2['Stu_perc']>=0.95*val)
print (df2)
     Stu_perc Matching list
0       70.0           70.0
1       66.5           66.5
2       68.0           68.0
3       60.0            NaN
4      100.0          100.0
5       12.0            NaN

Общее решение также работает, если benchmark_value пусто равно next с iter для возврата первого значения Series и, если не существует, используйте значение по умолчанию - здесь 0:

benchmark_value = pd.Series([])

val = next(iter(benchmark_value), 0)
df2['Matching list']= df2['Stu_perc'].where(df2['Stu_perc']>=0.95*val)
print (df2)
    Stu_perc  Matching list
0       70.0           70.0
1       66.5           66.5
2       68.0           68.0
3       60.0           60.0
4      100.0          100.0
5       12.0           12.0
0 голосов
/ 02 октября 2019

Похоже, что эталонное значение представляет собой серию с одной строкой, поэтому не фактическое число, я думаю, вам нужно получить доступ сначала.

Но это вернет список логических значений,Чтобы получить только те значения, которые вы хотите, вы можете использовать функцию where.

Попробуйте это:

df['Matching list']= df2['Stu_perc'].where(df2['Stu_perc'] >=0.95*benchmark_value[0][0]))

...