обновление поднабора данных для обновления родительского кадра данных - PullRequest
0 голосов
/ 02 мая 2019

У меня есть 4x4 фрейм данных (df).Я создал два дочерних кадра данных (4x1), (4x2).И обновил оба.В первом случае родитель обновляется, во втором - нет.Как обеспечить обновление родительского фрейма данных при обновлении дочернего фрейма?

У меня есть фрейм данных 4x4 (df).Исходя из этого, как родитель, я создал два дочерних кадра данных - dfA с одним столбцом (4x1) и dfB с двумя столбцами (4x2).У меня есть значения NaN в обоих подмножествах.Теперь, когда я использую fillna на обоих, в соответствующих dfA и dfB, я могу видеть значения NaN, обновленные с данным значением.Хорошо до сих пор.Однако теперь, когда я проверяю родительский кадр данных, в первом случае (4x1) обновленное значение отражает, тогда как во втором случае (4x2) это не так.Почему это так?И Что я должен сделать, чтобы изменения в дочернем фрейме данных отражались в родительском фрейме данных.

studentnames = ['Maths','English','Soc.Sci', 'Hindi', 'Science']
semisteronemarks = [15, 50, np.NaN, 50, np.NaN]
semistertwomarks = [25, 53, 45, 45, 54]
semisterthreemarks = [20, 50, 45, 15, 38]
semisterfourmarks = [26, 33, np.NaN, 35, 34]
semisters = ['Rakesh','Rohit', 'Sam', 'Sunil']
df1 = pd.DataFrame([semisteronemarks,semistertwomarks,semisterthreemarks,semisterfourmarks],semisters, studentnames)

# case 1
dfA = df['Soc.Sci']
dfA.fillna(value = 98, inplace = True)
print(dfA)
print(df)

# case 2
dfB = df[['Soc.Sci', 'Science']]
dfB.fillna(value = 99, inplace = True)
print(dfB)
print(df)
'''

## contents of parent df ->>
## Actual Output -
# case 1
               Maths    English Soc.Sci Hindi   Science
      Rakesh    15        50      98.0   50      NaN
      Rohit     25        53      45.0   45      54.0
      Sam       20        50      45.0   15      38.0
      Sunil     26        33      98.0   35      34.0

# case 2
               Maths    English Soc.Sci Hindi   Science
       Rakesh   15        50      NaN    50      NaN
       Rohit    25        53      45.0   45      54.0
       Sam      20        50      45.0   15      38.0
       Sunil    26        33      NaN    35      34.0


## Expected Output -
# case 1
               Maths    English Soc.Sci Hindi   Science
        Rakesh  15        50      98.0   50      NaN
        Rohit   25        53      45.0   45      54.0
        Sam     20        50      45.0   15      38.0
        Sunil   26        33      98.0   35      34.0

# case 2
              Maths     English Soc.Sci Hindi   Science
        Rakesh  15        50      99.0   50      NaN
        Rohit   25        53      45.0   45      54.0
        Sam     20        50      45.0   15      38.0
        Sunil   26        33      99.0   35      34.0

# note the difference in output for column Soc.Sci in case 2.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Вы должны были увидеть предупреждение:

Warning (from warnings module):
...
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Это означает, что dfB может быть копией вместо представления.И по результатам это так.Здесь мало что можно сделать, и, в частности, вы не можете заставить панд генерировать вид.Выбор зависит от параметров, известных только pandas и ее разработчикам.

Но всегда можно назначить столбцы родительского DataFrame:

# case 2
df = pd.DataFrame([semisteronemarks,semistertwomarks,semisterthreemarks,semisterfourmarks],semisters, studentnames)
df[['Soc.Sci', 'Science']] = df[['Soc.Sci', 'Science']].fillna(value = 99)
print(df)
0 голосов
/ 02 мая 2019

В вашем коде df1 определено df нет.

При использовании подхода

# case 1
dfA = df1['Soc.Sci']   # changed df to df1
dfA.fillna(value = 98, inplace = True)

df1['Soc.Sci'] = dfA  # Because dfA is not a dataframe but a series
# if you want to do
df1['Soc.Sci'] = dfA['Soc.Sci']  
# you will need to change the dfA
dfA = df1[['Soc.Sci']]  # this makes it a dataframe


# case 2
dfB = df1[['Soc.Sci', 'Science']] # changed df to df1
dfB.fillna(value = 99, inplace = True)

df1[['Soc.Sci','Science']] = dfB[['Soc.Sci','Science']]

print(df1)

Я бы предложил использовать fillna в родительском df.

df1['Soc.Sci'].fillna(value=99,inplace=True)

...