这里是Python新手,我无法创建一个可以将某些列的值提取为另一种形式的函数。我试图多次运行循环来获取数据,但是我找不到一种很好的pythonic方式来做到这一点。任何帮助或建议都将受到欢迎。
PS:带有“ Loaded with”的列具有要装入哪些项目的信息,但是您也可以通过查看名称为item_1L ...的列来获得此信息。
我找不到在SO上输入数据的更好方法,因此我创建了csv file of the dataframe。
我需要
形式的单独项目的LBHItem1 = 4.6x4.3x4.3 Item2 = 4.6x4.3x4.3或其他任何易于迭代的方式。
编辑:当我说我需要4.6x4.3x4.3形式的答案时,我的意思是我真的需要“ 4.6x4.3x4.3”形式的答案,即不是数字的乘积。我需要这样的字符串格式:
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)
答案 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