Я пытаюсь изменить форму информационного кадра, чтобы превратить его в более удобную структуру для построения графиков, и сейчас я занимаюсь преобразованием df с помощью iterrows или itertuple, следуя Какой самый эффективный способ цикл по панелям данных с пандами?
Ниже приведен слишком упрощенный набор данных, но реальный набор данных будет содержать десятки тысяч строк.
group subtopic code
fruit grapes 110A
fruit apple 110B
meat pork 220A
meat chicken 220B
meat duck 220C
vegetable lettuce 300A
vegetable tomato 310A
vegetable asparagus 320A
По сути, я хочу создать новый столбец ("code2") на основе того, имеет ли столбец ("code") одинаковое значение в столбце "group".
Я попытался запустить следующий код:
df = pd.read_excel(file1, sheetname = 'Sheet3')
def reshape_iterrows(df):
reshape = []
for i, j, in df.iterrows():
for _, k in df.iterrows():
if (j['code'] == k['code']):
pass
elif j['group'] == 'nan':
reshape.append({'code1':j['code'],
'code2': j['code'],
'group': 'None'})
elif (j['group'] == k['group']):
reshape.append({'code1': j['code'],
'code2': k['code'],
'group': j['group']})
else:
pass
return reshape
reshape_iterrows (DF)
или с помощью itertuples:
def reshape_iterrows(df):
reshape = []
for row1 df.itertuples():
for row2 in df.itertuples():
if (row1[3] == row2[3]):
pass
elif row1[1] == 'nan':
reshape.append({'code1':row1[3],
'code2': row1[3],
'group': 'None'})
elif (row1[1] == row2[1]):
reshape.append({'code1': row1[3],
'code2': row2[3],
'group': row1[1]})
else:
pass
return reshape
Я передаю изменение формы pd.DataFrame (), и ожидаемый результат ниже, который я затем использую столбцы code1 и code2 в качестве исходных и целевых параметров в nx.from_pandas_edgelist для генерации графика.
code1 code2 group
0 110A 110B fruit
1 110B 110A fruit
2 220A 220B meat
3 220A 220C meat
4 220B 220A meat
5 220B 220C meat
6 220C 220A meat
7 220C 220B meat
8 300A 300B vegetable
9 300A 300C vegetable
10 300B 300A vegetable
11 300B 300C vegetable
12 300C 300A vegetable
13 300C 300B vegetable
Как и другие, я заинтересован в поиске более эффективного способа итерации, возможно, с использованием логических операций Numpy? Нужны указания о том, как мне подойти к получению того же результата, используя векторизованные операции / операции с массивами.
Спасибо!