Присвойте значение конкретным ячейкам в панде DataFrame - PullRequest
0 голосов
/ 13 октября 2019

У меня есть структура данных, похожая на эту по структуре, хотя у меня более 10M строк с 40 столбцами

df = pd.DataFrame([['a1', 'b1','c1','d1'],
                   ['a2', 'b2','c2','d2'],
                   ['a3', 'b3','c3','d3'],
                   ['a4', 'b4','c4','d4'],
                   ['a5', 'b5','c5','d5'],
                   ['a6', 'b6','c6','d6'],
                   ['a7', 'b7','c7','d7']], columns=['pid','tid','aid','cid'])

Я хочу создать матрицу с 0 и 1 на основе условия, где значение будет 1, если столбецname равно значению в определенной строке, а в противном случае 0.

Я манипулировал данным кадром следующим образом:

colnames = df['aid'].append(df['cid'])

df2 = pd.concat([df,pd.DataFrame(columns=colnames)])
df2 = df2.set_index('pid')
df2 = df2.fillna(0)

cols = df2.columns.tolist()
cols = cols[-1:] + cols[:-1]
df2= df2[cols]

, что дает мне:

    tid aid  c1  c2  c3  c4  c5  c6  c7 cid  d1  d2  d3  d4  d5  d6  d7
pid                                                                    
a1   b1  c1   0   0   0   0   0   0   0  d1   0   0   0   0   0   0   0
a2   b2  c2   0   0   0   0   0   0   0  d2   0   0   0   0   0   0   0
a3   b3  c3   0   0   0   0   0   0   0  d3   0   0   0   0   0   0   0
a4   b4  c4   0   0   0   0   0   0   0  d4   0   0   0   0   0   0   0
a5   b5  c5   0   0   0   0   0   0   0  d5   0   0   0   0   0   0   0
a6   b6  c6   0   0   0   0   0   0   0  d6   0   0   0   0   0   0   0
a7   b7  c7   0   0   0   0   0   0   0  d7   0   0   0   0   0   0   0

СейчасЯ хочу изменить значение с 0 на 1, если значение в 'aid' или 'cid' равно имени столбца

Я пробовал несколько вещей, таких как следующие, и не могу заставить что-либо работать:

df2.loc['aid' == colnames] = 1
df2.loc['cid' == colnames] = 1

мой желаемый вывод:

    tid aid  c1  c2  c3  c4  c5  c6  c7 cid  d1  d2  d3  d4  d5  d6  d7
pid                                                                    
a1   b1  c1   1   0   0   0   0   0   0  d1   1   0   0   0   0   0   0
a2   b2  c2   0   1   0   0   0   0   0  d2   0   1   0   0   0   0   0
a3   b3  c3   0   0   1   0   0   0   0  d3   0   0   1   0   0   0   0
a4   b4  c4   0   0   0   1   0   0   0  d4   0   0   0   1   0   0   0
a5   b5  c5   0   0   0   0   1   0   0  d5   0   0   0   0   1   0   0
a6   b6  c6   0   0   0   0   0   1   0  d6   0   0   0   0   0   1   0
a7   b7  c7   0   0   0   0   0   0   1  d7   0   0   0   0   0   0   1

как бы я это сделал?

1 Ответ

0 голосов
/ 13 октября 2019

В вашем случае вы можете использовать get_dummies

df=pd.get_dummies(df,columns=['pid','aid'],prefix_sep='',prefix='')
df
  tid cid  a1  a2  a3  a4  a5  a6  a7  c1  c2  c3  c4  c5  c6  c7
0  b1  d1   1   0   0   0   0   0   0   1   0   0   0   0   0   0
1  b2  d2   0   1   0   0   0   0   0   0   1   0   0   0   0   0
2  b3  d3   0   0   1   0   0   0   0   0   0   1   0   0   0   0
3  b4  d4   0   0   0   1   0   0   0   0   0   0   1   0   0   0
4  b5  d5   0   0   0   0   1   0   0   0   0   0   0   1   0   0
5  b6  d6   0   0   0   0   0   1   0   0   0   0   0   0   1   0
6  b7  d7   0   0   0   0   0   0   1   0   0   0   0   0   0   1
...