Как получить значения из фрейма данных с динамическими столбцами - PullRequest
1 голос
/ 07 марта 2019

Python новичок здесь, я не могу создать функцию, которая может извлекать значения определенных столбцов в другую форму.Я пытался выполнить цикл несколько раз, чтобы получить данные, но я не могу найти хороший питонический способ сделать это.Любая помощь или предложение будут приветствоваться.

PS: столбец с «Loaded with» содержит информацию о том, какие элементы загружены в него, но вы также можете получить эту информацию, увидев, что есть несколько столбцов с именем item_1L ...

Мне не удалось найти лучший способ ввода данных в SO, поэтому я создал CSV-файл для фрейма данных .

Мне нужна LBH отдельных элементовв виде

Item1 = 4.6x4.3x4.3 Item2 = 4.6x4.3x4.3 или любым другим легко повторяемым способом.

РЕДАКТИРОВАТЬ: Когда я говорю, что мне нужен ответ вФорма 4,6x4,3x4,3, я действительно имел в виду, что она мне нужна в форме "4,6x4,3x4,3", то есть не произведение чисел.Мне нужен формат строки, подобный этому:

format i need

enter image description here

import pandas as pd
df = pd.DataFrame({'0': ['index', 'Name', 'Loaded 
with','item_0L','item_0B','item_0H','item_1L','item_1B','item_1H'], 
                   '1': [0, 'Tata- 
417','01','4.3','4.3','4.6','4.3','4.3','4.6',]})

формат строки

index  Loadedwith  item_0L  item_0B  item_0H  item_1L  item_1B  item_1H    
1              01      4.6      4.3      4.3      4.6      4.3  4.3'

Вот что я пробовал:

def get_df (df):

    total_trucks = len(df)
    total_items = 0
    for i in range(len(df["Loaded with"])):
        total_items += len((df["Loaded with"].iloc[i]))



    for i in range(len(df["Loaded with"])):
        for j in range(total_items):
            for k in range(len((df["Loaded with"].iloc[i]))):
#                 pass
#                 print("value of i j k is {} {} {}".format(i,j,k))
                if(pd.isnull(Packed_trucks.loc["item_" + str(j) + "L"])):
                    display(Packed_trucks["item_" + str(j) + "L"])
#     return 0


get_df(Packed_trucks)

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Может быть что-то вроде:

m=df.loc[:,df.filter(like='item').columns]
df['Item1']=m.filter(like='0').astype(float).prod(axis=1)
df['Item2']=m.filter(like='1').astype(float).prod(axis=1)

Выход:

    index   Loadedwith   item_0L    item_0B item_0H  item_1L    item_1B   item_1H   Item1   Item2
        1            1       4.6        4.3     4.3      4.6         4.3      4.3   85.054  85.054

EDIT

df['Item1']=m.astype(str).filter(like='0').apply(lambda x: 'X'.join(x),axis=1)
df['Item2']=m.astype(str).filter(like='1').apply(lambda x: 'X'.join(x),axis=1)
print(df)

   index  Loadedwith  item_0L  item_0B  item_0H  item_1L  item_1B item_1H  \
0      1           1      4.6      4.3      4.3      4.6      4.3     4.3   

         Item1        Item2  
0  4.6X4.3X4.3  4.6X4.3X4.3  
0 голосов
/ 07 марта 2019

Это решение будет использовать функцию pd.melt и создаст таблицу, в которой каждая строка будет представлять собой комбинацию Грузовик (Индекс) и Номер изделия

df = pd.read_csv('df.csv')

# We will operate on a subset of columns, leaving just index and columns we need
truck_level_df = df.drop(['Name', 'TruckID', 'Length', 'Breadth', 
'Height', 'Volume', 'Weight', 'Price', 'Quantity', 'Loaded with'], 
axis = 1)

truck_level_df:

       index  item_0L  item_0B  item_0H  item_1L  item_1B  item_1H
0      1      4.6      4.3      4.3      4.6      4.3      4.3
# Create table with all the items and their measures
item_measure_level_df = truck_level_df.melt(id_vars = 'index', 
var_name = 'item_id_and_measure', value_name = 'item_val')

# Remove unneeded substring
item_measure_level_df['item_id_and_measure'] = 
item_measure_level_df['item_id_and_measure'].str.replace('item_', '')

# Extract Item ID
item_measure_level_df['item_id'] = 
item_measure_level_df['item_id_and_measure']
.str.replace(r'[A-Z]*', '', case = False)

# Create df where each line is a combination 
# of a Truck and an item
item_level_df = item_measure_level_df[['index', 'item_id']].drop_duplicates()

item_level_df:

       index item_id_and_measure  item_val item_id
0      1                  0L       4.6       0
1      1                  0B       4.3       0
2      1                  0H       4.3       0
3      1                  1L       4.6       1
4      1                  1B       4.3       1
5      1                  1H       4.3       1

Последний шаг:

item_measure_level_df['item_val'] = item_measure_level_df['item_val'].astype('str')

# Group by Item and get LxHxB string
item_level_df['volume_string'] = item_measure_level_df.sort_values(by = ['index','item_id_and_measure']).groupby(['index','item_id'])['item_val'].apply(lambda x: ' x '.join(x)).values

Выход:

  index item_id    volume_string
0     1       0  4.3 x 4.3 x 4.6
3     1       1  4.3 x 4.3 x 4.6

Это решение будет переваривать столько групп столбцов, сколько у вас будет

Общая записная книжка: https://colab.research.google.com/drive/16xUCMCH7rhOOp9Jwlv2RISnnmpzK-06d#scrollTo=lRDVe6B40VsH

0 голосов
/ 07 марта 2019

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

Линия разбора

f = open(file, "r")
line = f.readline()
data = []

while len(line) != 0:
    data.append(line.strip(","))
    //other code and stuff
    line = f.readline()

f.close()

Это откроет файл, прочитает данные и сформирует список списков на основе данных. При этом становится очень легко выполнять итерацию по списку, превращая Segway в итерацию.

Перебор

Если вам нужно перебрать список значений, цикл for является самым простым способом. Если вам нужно быстро получить всю строку или столбец, я бы порекомендовал

data = [your data]
row = data[0][:]
column = data[:][0]

просто замените 0 любым нужным вам индексом. ПРИМЕЧАНИЕ. Это будет работать только с двумерными списками, поэтому я рекомендую синтаксический анализ, как я уже показал ранее.

Редактировать: Вы можете найти больше примеров с этим, взглянув на понимание списка и соединение списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...