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

Я получил файл для обработки.Похоже:

       1       0     2      3
   0 name1 sample1 typeA1 type1
   1 name2 sample2 typeA2 type2
   2 name3 sample3 typeA3 type3
   3 name4 sample4 typeA4 type4

В typeA и type столбцах я получил несколько значений.'A', 'B', 'C' или 'D'.

Что я хочу сделать:

Нужно изменить столбцы typeA и type на основе их значений.Пример:

if in typeA[0] is 'D' and in type[0] = 'D' затем typeA[0] = 'Z' and type[0] = Y

if in typeA[0] is 'A' and in type[0] = 'C', затем typeA[0] = 'Z' and type[0] = Z

... и т. Д.

Я написал, если ещеЗаявление и положить его в цикл, код выглядит так:

for n in range(df.shape[0]):
    if df.iloc[n,2] == 'D' and df.iloc[n,3] == 'D':
      df.iloc[n,2] = 'Z'
      df.iloc[n,3] = 'Y'
    elif .... etc.

У меня есть вопросы:

** Существуют самые простые способы сделать это, используя только панд? **

Я нашел пример, подобный этому:

data.loc[data.bidder == 'parakeet2004', 'bidderrate'] = 100

Где автор изменяет все значения bidderrate's col на 100, когда в bidder col указано значение "parakeet2004".Без какого-либо цикла он меняет 3 строки в этом случае.

Я пытался сделать это (по-разному) для столбца с двойным оператором, как в моем случае, но я получил только Key Error.Возможно ли даже для большего количества условий?

И если кто-то может объяснить мне, помимо основного вопроса: в моем случае в моем цикле я работаю с копией фреймов данных или с исходным объектом? **

Если это копия, что я должен сделать, чтобы работать с исходным объектом (я бы не стал тратить впустую память)?

Я нашел несколько похожих вопросов по SO, но никто не может решить мою проблему: C

.head () моего DF:

    1           0           2   3
0   Adac44402   samp1       C   D
1   Adac44402   samp341     A   D
2   Adac44402   samp2341    A   C
3   Adac44402   samp221     C   B
4   Adac44402   samp112     C   D

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Создайте вспомогательный DataFrame со старыми и новыми значениями, добавьте их в исходный DataFrame с помощью merge с левым соединением и сальдо на fillna пропущенные значения:

L = [('D','D','Z','Y'), ('A','C','Z','Z')]
cols = ['2','3']

#changed columns to strings for correct match
df.columns = df.columns.astype(str)
cols1 = [f'{a}_' for a in cols]
df1 = pd.DataFrame(L, columns=cols  + cols1)
print (df1)
   2  3 2_ 3_
0  D  D  Z  Y
1  A  C  Z  Z

df = df.merge(df1, how='left')
df[cols1] = df[cols1].fillna(df[cols].rename(columns=lambda x: x + '_'))
df = df.drop(cols, axis=1).rename(columns=lambda x: x.rstrip('_'))
print (df)
           1         0  2  3
0  Adac44402     samp1  C  D
1  Adac44402   samp341  A  D
2  Adac44402  samp2341  Z  Z
3  Adac44402   samp221  C  B
4  Adac44402   samp112  C  D

Другая идея - использовать цикл с boolean indexing и список оригиналов со значениями замены в кортежах:

L = [('D','D','Z','Y'), ('A','C','Z','Z')]

for x in L:
    df.loc[(df[2] == x[0]) & (df[3] == x[1]), [2,3]] = [x[2], x[3]]

print (df)
           1         0  2  3
0  Adac44402     samp1  C  D
1  Adac44402   samp341  A  D
2  Adac44402  samp2341  Z  Z
3  Adac44402   samp221  C  B
4  Adac44402   samp112  C  D
1 голос
/ 15 мая 2019

Я хотел бы сделать это

temp = pd.DataFrame({'A': ['name' + str(i) for i in range(1,5)],
                     'B': ['sample' + str(i) for i in range(1,5)],
                     'C': ['DtypeA', 'typeA', 'DtypeA', 'typeA',],
                     'D': ['typeA', 'DtypeD', 'DtypeD', 'typeD']})

, как

       A        B       C       D
0  name1  sample1  DtypeA   typeA
1  name2  sample2   typeA  DtypeD
2  name3  sample3  DtypeA  DtypeD
3  name4  sample4   typeA   typeD

Сначала вам нужно проиндексировать все строки, которые удовлетворяют вашим условиям (здесь только третья строка удовлетворяет условию)

condition = ((temp['C'].str[0] == 'D') & (temp['D'].str[0] == 'D'))

Затем, проиндексировав их, вы можете изменить их значения

temp.loc[condition, 'C'] = 'Z' + temp.loc[condition, 'C'].str[1:]

, что дает

       A        B       C       D
0  name1  sample1  DtypeA   typeA
1  name2  sample2   typeA  DtypeD
2  name3  sample3  ZtypeA  DtypeD
3  name4  sample4   typeA   typeD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...