dataframeni iterrows bilan yangilash

Dataframe qiymatlarini quyidagi qatorlar yordamida amalga oshirishni istayman:

df = pd.DataFrame([ list( range( 0, 6)) + [np.NaN] * 5, 
                    list( range(10,16)) + [np.NaN] * 5, 
                    list( range(20,26)) + [np.NaN] * 5, 
                    list( range(30,36)) + [np.NaN] * 5])

for (index, row) in df.iterrows():
    df.loc[ index, 6: 11] =  row[ 1: 6] - row [ 0] 

Nima uchun df yangilanmadi?

df.loc [indeks, 1: 6] - df.loc [indeks, 0] bilan satrini [1: 6] - row [0]

1
siz o'zingizning muammoingizni hal qiladigan javobni ovoz berishingiz va qabul qilishingiz kerak (tasdiq belgisini bosing). Bu kelajakdagi mehmonlar siz uchun qanday ish bo'lganini va ular uchun qanday ish bo'lishi mumkinligini aniq bilib olishga imkon beradi. Faqat narsalarni umumlashtirgan yana bir javob qo'shmang.
qo'shib qo'ydi muallif Paul H, manba
@Paul H: Men har ikkala javobni yuqoriga qaratdim. Mening ovozim yozilganligi haqida xabarim bor edi. Garchi menda yetarlicha obro'-e'tiborga ega bo'lmasam-da (<15)
qo'shib qo'ydi muallif alEx, manba
@Paul H: Men har ikkala javobni yuqoriga qaratdim. Mening ovozim yozilganligi haqida xabarim bor edi. Garchi menda yetarlicha obro'-e'tiborga ega bo'lmasam-da (<15)
qo'shib qo'ydi muallif alEx, manba

6 javoblar

loc bilan Pandas belgilash tayinlashdan oldin katalogni hizalamak qiladi. Sizning ustunlaringiz nomlari bu erda noto'g'ri joylashtiriladi. Buni qiling:

for (index, row) in df.iterrows():
    df.loc[ index, 6: 11] =  (row[ 1: 6] - row [ 0]).values

df
Out[23]: 
   0   1   2   3   4   5    6    7    8    9    10
0   0   1   2   3   4   5  1.0  2.0  3.0  4.0  5.0
1  10  11  12  13  14  15  1.0  2.0  3.0  4.0  5.0
2  20  21  22  23  24  25  1.0  2.0  3.0  4.0  5.0
3  30  31  32  33  34  35  1.0  2.0  3.0  4.0  5.0

Qo'shimcha ma'lumot olish uchun bu yerga kiring .

Series va DataFrame-ni belgilashda ogohlantirish pandasi barcha AXES-larni moslashtiradi   .loc, .iloc va .ix. Bu ustunni o'zgartirmaydi   qiymatni belgilashdan oldin hizalanish.

3
qo'shib qo'ydi
Loklar narsalarni bir-biriga moslashadi, chunki siz shunga o'xshash indeksli df va ketma-ketlik orasida topshiriq berganingizda, vaqtning aksariyat qismi bu siz kutgan narsadir. O'Rdagi jinoyatchi hech qanday domenning aniq indekslari aniqlanmaganligi va indeksga kirishni dfga nisbatan bir xil ko'r-ko'rona filter sifatida bajarishdan iborat: bu alohida hol. Ikkala tegishli indeks bilan to'g'ridan-to'g'ri filtrlangan ma'lumotlarimni belgilashni va hizalamaslik sehrini qabul qilaman.
qo'shib qo'ydi muallif Boud, manba
Bu javob va hujjatlar men uchun mantiqsiz. "Hizalama" nimani anglatadi? Nima uchun .loc narsalarni moslashtiradi, lekin [] emas?
qo'shib qo'ydi muallif frabcus, manba

loc bilan Pandas belgilash tayinlashdan oldin katalogni hizalamak qiladi. Sizning ustunlaringiz nomlari bu erda noto'g'ri joylashtiriladi. Buni qiling:

for (index, row) in df.iterrows():
    df.loc[ index, 6: 11] =  (row[ 1: 6] - row [ 0]).values

df
Out[23]: 
   0   1   2   3   4   5    6    7    8    9    10
0   0   1   2   3   4   5  1.0  2.0  3.0  4.0  5.0
1  10  11  12  13  14  15  1.0  2.0  3.0  4.0  5.0
2  20  21  22  23  24  25  1.0  2.0  3.0  4.0  5.0
3  30  31  32  33  34  35  1.0  2.0  3.0  4.0  5.0

Qo'shimcha ma'lumot olish uchun bu yerga kiring .

Series va DataFrame-ni belgilashda ogohlantirish pandasi barcha AXES-larni moslashtiradi   .loc, .iloc va .ix. Bu ustunni o'zgartirmaydi   qiymatni belgilashdan oldin hizalanish.

3
qo'shib qo'ydi
Loklar narsalarni bir-biriga moslashadi, chunki siz shunga o'xshash indeksli df va ketma-ketlik orasida topshiriq berganingizda, vaqtning aksariyat qismi bu siz kutgan narsadir. O'Rdagi jinoyatchi hech qanday domenning aniq indekslari aniqlanmaganligi va indeksga kirishni dfga nisbatan bir xil ko'r-ko'rona filter sifatida bajarishdan iborat: bu alohida hol. Ikkala tegishli indeks bilan to'g'ridan-to'g'ri filtrlangan ma'lumotlarimni belgilashni va hizalamaslik sehrini qabul qilaman.
qo'shib qo'ydi muallif Boud, manba
Bu javob va hujjatlar men uchun mantiqsiz. "Hizalama" nimani anglatadi? Nima uchun .loc narsalarni moslashtiradi, lekin [] emas?
qo'shib qo'ydi muallif frabcus, manba

Siz kamdan-kam hollarda dataframe orqali yinelemeniz kerak. Buni faqat qilaman:

import pandas
import numpy
x = numpy.array([
    list(range(0, 6)) + [numpy.NaN] * 5, 
    list(range(10, 16)) + [numpy.NaN] * 5, 
    list(range(20, 26)) + [numpy.NaN] * 5, 
    list(range(30, 36)) + [numpy.NaN] * 5
])

x[:, 6:] = x[:, 1:6] - x[:, [0]]

pandas.DataFrame(x)

Meni beradi:

     0     1     2     3     4     5    6    7    8    9    10
0   0.0   1.0   2.0   3.0   4.0   5.0  1.0  2.0  3.0  4.0  5.0
1  10.0  11.0  12.0  13.0  14.0  15.0  1.0  2.0  3.0  4.0  5.0
2  20.0  21.0  22.0  23.0  24.0  25.0  1.0  2.0  3.0  4.0  5.0
3  30.0  31.0  32.0  33.0  34.0  35.0  1.0  2.0  3.0  4.0  5.0
1
qo'shib qo'ydi

Siz kamdan-kam hollarda dataframe orqali yinelemeniz kerak. Buni faqat qilaman:

import pandas
import numpy
x = numpy.array([
    list(range(0, 6)) + [numpy.NaN] * 5, 
    list(range(10, 16)) + [numpy.NaN] * 5, 
    list(range(20, 26)) + [numpy.NaN] * 5, 
    list(range(30, 36)) + [numpy.NaN] * 5
])

x[:, 6:] = x[:, 1:6] - x[:, [0]]

pandas.DataFrame(x)

Meni beradi:

     0     1     2     3     4     5    6    7    8    9    10
0   0.0   1.0   2.0   3.0   4.0   5.0  1.0  2.0  3.0  4.0  5.0
1  10.0  11.0  12.0  13.0  14.0  15.0  1.0  2.0  3.0  4.0  5.0
2  20.0  21.0  22.0  23.0  24.0  25.0  1.0  2.0  3.0  4.0  5.0
3  30.0  31.0  32.0  33.0  34.0  35.0  1.0  2.0  3.0  4.0  5.0
1
qo'shib qo'ydi

Rahmat. Men ikkita echimni qo'shdim:

df = pd.DataFrame([ list( range( 0, 6)) + [np.NaN] * 5, 
                    list( range(10,16)) + [np.NaN] * 5, 
                    list( range(20,26)) + [np.NaN] * 5, 
                    list( range(30,36)) + [np.NaN] * 5])

df.loc[ :, 6: 11] =  (row[ 1: 6] - row [ 0]).values
df

Out[10]:
    0   1   2   3   4   5   6   7   8   9   10
0   0   1   2   3   4   5   1.0 2.0 3.0 4.0 5.0
1   10  11  12  13  14  15  1.0 2.0 3.0 4.0 5.0
2   20  21  22  23  24  25  1.0 2.0 3.0 4.0 5.0
3   30  31  32  33  34  35  1.0 2.0 3.0 4.0 5.0

EDIT:

Aslida, bu ishlamayapti! Mening haqiqiy namunamda muammolar mavjud va ma'lumot bu kichik misolga qarash kerak emas.

Iterrows() hal sekin (mening ma'lumot doirasi taxminan 9000 * 500 atrofida), shuning uchun qator qator echimini topmoqchiman. Ma'lumotlar kvadratini numpy qatoriga aylantirish, hisoblashni bajarish va ma'lumotlar doirasiga qaytish.

import numpy as np
import pandas as pd

df = pd.DataFrame([ list( range( 0, 6)) + [np.NaN] * 5, 
                    list( range(10,16)) + [np.NaN] * 5, 
                    list( range(20,26)) + [np.NaN] * 5, 
                    list( range(30,36)) + [np.NaN] * 5])
x = df.as_matrix()
x[ :, 6:] = x[ :, 1: 6] - x[ :, [ 0]]
df = pd.DataFrame( x, columns=df.columns, index=df.index, dtype='int8')
df

Out[15]:
    0   1   2   3   4   5   6   7   8   9   10
0   0   1   2   3   4   5   1   2   3   4   5
1   10  11  12  13  14  15  1   2   3   4   5
2   20  21  22  23  24  25  1   2   3   4   5
3   30  31  32  33  34  35  1   2   3   4   5
In [ ]:
0
qo'shib qo'ydi

Rahmat. Men ikkita echimni qo'shdim:

df = pd.DataFrame([ list( range( 0, 6)) + [np.NaN] * 5, 
                    list( range(10,16)) + [np.NaN] * 5, 
                    list( range(20,26)) + [np.NaN] * 5, 
                    list( range(30,36)) + [np.NaN] * 5])

df.loc[ :, 6: 11] =  (row[ 1: 6] - row [ 0]).values
df

Out[10]:
    0   1   2   3   4   5   6   7   8   9   10
0   0   1   2   3   4   5   1.0 2.0 3.0 4.0 5.0
1   10  11  12  13  14  15  1.0 2.0 3.0 4.0 5.0
2   20  21  22  23  24  25  1.0 2.0 3.0 4.0 5.0
3   30  31  32  33  34  35  1.0 2.0 3.0 4.0 5.0

EDIT:

Aslida, bu ishlamayapti! Mening haqiqiy namunamda muammolar mavjud va ma'lumot bu kichik misolga qarash kerak emas.

Iterrows() hal sekin (mening ma'lumot doirasi taxminan 9000 * 500 atrofida), shuning uchun qator qator echimini topmoqchiman. Ma'lumotlar kvadratini numpy qatoriga aylantirish, hisoblashni bajarish va ma'lumotlar doirasiga qaytish.

import numpy as np
import pandas as pd

df = pd.DataFrame([ list( range( 0, 6)) + [np.NaN] * 5, 
                    list( range(10,16)) + [np.NaN] * 5, 
                    list( range(20,26)) + [np.NaN] * 5, 
                    list( range(30,36)) + [np.NaN] * 5])
x = df.as_matrix()
x[ :, 6:] = x[ :, 1: 6] - x[ :, [ 0]]
df = pd.DataFrame( x, columns=df.columns, index=df.index, dtype='int8')
df

Out[15]:
    0   1   2   3   4   5   6   7   8   9   10
0   0   1   2   3   4   5   1   2   3   4   5
1   10  11  12  13  14  15  1   2   3   4   5
2   20  21  22  23  24  25  1   2   3   4   5
3   30  31  32  33  34  35  1   2   3   4   5
In [ ]:
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming