Вычисление нового столбца в pandas dataframe, который является подмножеством значений, возвращает ошибку столбца not found - PullRequest
0 голосов
/ 14 февраля 2019

Мне интересно найти сумму значений в столбце, создающем новый столбец в процессе на подмножестве кадра данных, удовлетворяющего некоторому условию.Я не уверен, как работать с суммой нового столбца из этих двух, так как я получаю сообщение об ошибке при попытке получить доступ к Новому столбцу , созданному в процессе:

import pandas as pd 

d1={'X':[1,10,100,1000,1,10,100,1000,1,10,100,1000],
    'Y':[0.2,0.5,0.4,1.2,0.1,0.25,0.2,0.6,0.05,0.125,0.1,0.3],
    'RUN':[1,1,1,1,2,2,2,2,3,3,3,3]
    }
df=pd.DataFrame(d1)

for RUNno in (df.RUN.unique()):
    df1=df.RUN==RUNno #Selects the rows matching RUNno
    df[df1]['NewColumn']=df[df1]['X']+df[df1]['Y'] #For the selected dataset, calculates the sum of two columns and creates a new column
    print(df[df1].NewColumn) #Print the contents of the new column

Я не могу получить содержимое df [df1] .NewColumn, так как не могу определить ключ NewColumn.Я почти уверен, что этот способ создания новых столбцов работает на стандартном фрейме данных df, но не уверен, почему он не работает на df [df1].Например.

df['NewColumn']=df['X']+df['Y'] 
df.NewColumn 

Будет работать без проблем.

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

import pandas as pd 
from scipy.interpolate import interp1d 
interpolating_functions=dict() 
d1={'X':[1,10,100,1000,1,10,100,1000,1,10,100,1000], 
    'Y':[0.2,0.5,0.4,1.2,0.1,0.25,0.2,0.6,0.05,0.125,0.1,0.3], 
    'RUN':[1,1,1,1,2,2,2,2,3,3,3,3] } 
d2={'X':[1,10,100,1000,1,10,100,1000,1,10,100,1000], 
    'Y':[0.2,0.5,0.4,1.2,0.1,0.25,0.2,0.6,0.05,0.125,0.1,0.3], 
    'RUN':[1,1,1,1,2,2,2,2,3,3,3,3] } 
df=pd.DataFrame(d1) 
df2=pd.DataFrame(d2)
for RUNno in (df.RUN.unique()):
    df1=df.RUN==RUNno 
    df3=df.RUN==RUNno 
    interpolating_functions[RUNno]=interp1d(df2[df3].X,df2[df3].Y) 
    df[df1]['NewColumn']=df[df1]['X']+interpolating_functions[RUNno](df2[df3]['X']) 
    print(df[df1].NewColumn) 

1 Ответ

0 голосов
/ 14 февраля 2019

Используйте пользовательскую функцию с GroupBy.apply с созданием нового столбца и затем возвращайте каждую группу - здесь x:

def func(x):
    #check groups
    print (x)
    #working with groups DataFrame x
    x['NewColumn']=x['X']+x['Y']
    return x

df = df.groupby('RUN').apply(func)

print (df)
       X      Y  RUN  NewColumn
0      1  0.200    1      1.200
1     10  0.500    1     10.500
2    100  0.400    1    100.400
3   1000  1.200    1   1001.200
4      1  0.100    2      1.100
5     10  0.250    2     10.250
6    100  0.200    2    100.200
7   1000  0.600    2   1000.600
8      1  0.050    3      1.050
9     10  0.125    3     10.125
10   100  0.100    3    100.100
11  1000  0.300    3   1000.300

Кажется, вам нужно loc для выбора столбцовпо маскам требуется только одинаковая длина индекса в обоих фреймах данных:

for RUNno in (df.RUN.unique()):
    df1=df.RUN==RUNno 
    df3=df.RUN==RUNno 
    interpolating_functions[RUNno]=interp1d(df2.loc[df3, 'X'], df2.loc[df3,'Y']) 

    df.loc[df1, 'NewColumn'] = df.loc[df1, 'X'] + interpolating_functions[RUNno](df2.loc[df3, 'X']) 

print (df)
       X      Y  RUN  NewColumn
0      1  0.200    1      1.200
1     10  0.500    1     10.500
2    100  0.400    1    100.400
3   1000  1.200    1   1001.200
4      1  0.100    2      1.100
5     10  0.250    2     10.250
6    100  0.200    2    100.200
7   1000  0.600    2   1000.600
8      1  0.050    3      1.050
9     10  0.125    3     10.125
10   100  0.100    3    100.100
11  1000  0.300    3   1000.300
...