Как я могу сопоставить значения в матрице на python, используя pandas? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь сопоставить значения в матрице на python с использованием pandas данных. Возможно, это не лучший способ express.

Представьте, что у вас есть следующий набор данных:

import pandas as pd

d = {'stores':['','','','',''],'col1': ['x','price','','',1],'col2':['y','quantity','',1,''], 'col3':['z','',1,'',''] }
df = pd.DataFrame(data=d)
    stores   col1    col2    col3
0   NaN        x      y        z
1   NaN      price  quantity  NaN
2   NaN       NaN    Nan       1
3   NaN       NaN     1       NaN
4   NaN        1     NaN      NaN

Я пытаюсь получить следующее:

    stores   col1    col2    col3
0   NaN        x      y        z
1   NaN      price  quantity  NaN
2    z        NaN    Nan       1
3    y        NaN     1       NaN
4    x         1     NaN      NaN

Есть идеи, как это может работать? Я пробовал запускать циклы в списках, но я не совсем уверен, как это сделать.

Это то, что я имею до сих пор, но это просто ужасно (и, очевидно, не работает), и я уверен, что есть намного более простой способ сделать это, но я просто не могу разобраться с этим.

stores = ['x','y','z']
for i in stores:
    for v in df.iloc[0,:]:
        if i==v :
            df['stores'] = i

Это дает следующее:



  stores    col1    col2    col3
0   z        x        y       z
1   z       price   quantity NaN    
2   z       NaN      NaN      1
3   z       NaN       1      NaN
4   z        1       NaN     NaN

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Вы можете заполнить весь столбец сразу, например так:

df["stores"] = df[["col1", "col2", "col3"]].rename(columns=df.loc[0]).eq(1).idxmax(axis=1)

Сначала создается версия кадра данных со столбцами, переименованными в «x», «y» и «z» после значения в первом ряду; затем idxmax(axis=1) возвращает заголовок столбца, связанный с максимальным значением в каждой строке (которое является истинным).

Однако это добавляет «x» в строках, где ни один из столбцов не имеет 1. Если это это проблема, вы можете сделать что-то вроде этого:

df["NA"] = 1   # add a column of ones
df["stores"] = df[["col1", "col2", "col3", "NA"]].rename(columns=df.loc[0]).eq(1).idxmax(axis=1)
df["stores"].replace(1, np.NaN, inplace=True)   # replace the 1s with NaNs
0 голосов
/ 24 января 2020

Вы можете выполнить эту задачу с помощью oop, выполнив следующие действия. Он проходит по каждому столбцу, исключая первый, в который вы хотите записать данные. Принимает значения индекса, где значение равно 1, и записывает значение из первой строки в столбец «stores».

Будьте внимательны, если у вас может быть 1 в нескольких строках, и в этом случае он заполнит столбец store. с последним столбцом, который имел значение 1.

for col in df.columns[1:]:
index_values = df[col][df[col]==1].index.tolist()
df.loc[index_values, 'stores'] = df[col][0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...