如何从具有动态列的数据框中获取值

时间:2019-03-07 17:51:24

标签: python pandas dataframe

这里是Python新手,我无法创建一个可以将某些列的值提取为另一种形式的函数。我试图多次运行循环来获取数据,但是我找不到一种很好的pythonic方式来做到这一点。任何帮助或建议都将受到欢迎。

PS:带有“ Loaded with”的列具有要装入哪些项目的信息,但是您也可以通过查看名称为item_1L ...的列来获得此信息。

我找不到在SO上输入数据的更好方法,因此我创建了csv file of the dataframe

我需要

形式的单独项目的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 个答案:

答案 0 :(得分:1)

可能类似于:

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  

答案 1 :(得分:0)

我有点困惑,所以如果这很笼统,我深表歉意,但是看来您要么需要解析数据,要么遍历数据。我建议遵循以下原则:

分析线

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()

这将打开一个文件,并将读取数据并根据数据形成列表列表。这样一来,遍历列表变得非常容易,从而使遍历该列表成为可能。

迭代

如果需要遍历值列表,最简单的方法是for循环。不过,如果您需要快速获取整行或整列,我建议

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

只需将0替换为所需的索引即可。 注意:这仅适用于二维列表,这就是为什么我建议如前所述进行解析的原因。

编辑:通过查看列表理解和列表拼接,您可以找到更多示例

答案 2 :(得分:0)

此解决方案将利用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