Python 如何填写列表中的值并将其转换为数据帧?(第二部分)
我有上一个问题的修改数据框: 我想使用前一个问题中关于两个字段的代码:Python 如何填写列表中的值并将其转换为数据帧?(第二部分),python,pandas,list,dataframe,numpy,Python,Pandas,List,Dataframe,Numpy,我有上一个问题的修改数据框: 我想使用前一个问题中关于两个字段的代码: photo_df= df1.fillna('').filter(like='Photo') vals = [(i, y) for i, x in enumerate(photo_df.to_numpy()) for y in vals[:3] + [['PH',z] for z in photo_df.columns[x!='']]] 我尝试的是: photo_df= df1.fi
photo_df= df1.fillna('').filter(like='Photo')
vals = [(i, y) for i, x in enumerate(photo_df.to_numpy())
for y in vals[:3] + [['PH',z]
for z in photo_df.columns[x!='']]]
我尝试的是:
photo_df= df1.fillna('').filter(like='Photo')
product_df = df1.fillna('').filter(like='Description')
vals = [(i, y) for i, x in enumerate(photo_df.to_numpy())
for y in vals[:3] + [['PH',z]
for z in photo_df.columns[x!='']]]
vals = [(i, y) for i, x in enumerate(product_df.to_numpy())
for y in vals[:4] + [['Description',z]
for z in product_df.columns[x!='']]]
L = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals]
df = pd.concat(L)
但这就给出了列表之外的列表
我又试了一次,
我将数据帧分为两部分:
photo_df= df1.fillna('').filter(like='Photo')
photo_df = photo_df.fillna('')
product_df = df1.fillna('').filter(like='Description')
product_df = product_df.fillna('')
vals = [(i, y) for i, x in enumerate(photo_df.to_numpy())
for y in vals[:3] + [['PH',z]
for z in photo_df.columns[x!='']]]
vals2 = [(i, y) for i, x in enumerate(product_df.to_numpy())
for y in vals[:0] + [['Description',z]
for z in product_df.columns[x!='']]]
L = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals]
M = [df2.loc[df2.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals2]
df = pd.concat(L)
df3 = pd.concat(M)
df = pd.concat([df,df3])
输出:
I A
PH A1.jpg
PH A2.jpg
I B
PH B1.jpg
PH B2.jpg
PH B3.jpg
PH B4.jpg
I C
PH C1.jpg
Description Nice
Description Beauiful
Description Ugly
Description Damaged
Description Cute
Description Handsome
Description Nice
如何以以下格式正确连接
预期的Dataframe与前面的问题类似,并添加了说明
预期产出:
I A
PH A1.jpg
PH A2.jpg
Description Nice
Description Beauiful
I B
PH B1.jpg
PH B2.jpg
PH B3.jpg
PH B4.jpg
Description Ugly
Description Damaged
I C
PH C1.jpg
Description Cute
Description Handsome
Description Nice
您已经拥有合并/连接的数据帧。这只是一个正确排序的问题吗 试试这个:
df['sort'] = [len(x) for x in df[0]]
df['Item'] = df.index
df.sort_values(by=['Item', 'sort'], inplace=True)
df.drop(labels=['Item', 'sort'], axis=1, inplace=True)
print(df.to_string(header=False, index=False))
它产生以下输出:
I A
PH A1.jpg
PH A2.jpg
Description Nice
Description Beautiful
I B
PH B1.jpg
PH B2.jpg
PH B3.jpg
PH B4.jpg
Description Ugly
Description Damaged
I C
PH C1.jpg
Description Cute
Description Handsome
Description Nice
您已经拥有合并/连接的数据帧。这只是一个正确排序的问题吗 试试这个:
df['sort'] = [len(x) for x in df[0]]
df['Item'] = df.index
df.sort_values(by=['Item', 'sort'], inplace=True)
df.drop(labels=['Item', 'sort'], axis=1, inplace=True)
print(df.to_string(header=False, index=False))
它产生以下输出:
I A
PH A1.jpg
PH A2.jpg
Description Nice
Description Beautiful
I B
PH B1.jpg
PH B2.jpg
PH B3.jpg
PH B4.jpg
Description Ugly
Description Damaged
I C
PH C1.jpg
Description Cute
Description Handsome
Description Nice
使用:
使用:
是的,添加了与以前相同的新Field的情况我无法运行无错误的代码,有VAL=['I','Item'],['Q','Quantity'],['P','Price']]?还添加了前一节中的一些代码我尝试测试您的解决方案,但失败,。我使用I I U U df=df.我使用I I I I U U U I I I I I I I I U U U U U U U U I I I I U U U F=df.我使用I I I I I I I U U U U U U U F=df=df.我使用I I I I I I I I I I I I I I I I I I I I U U U U U U U U I I I I I I I I I I I I I I I I I U U U U U U U U U U U F=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=I['I’,'I’,'I’,'I’,'I’,'I’,'I_df['Description']=I_df['Description'].fillna'Description'vals=[['I','Item'],['Q','Quantity'],['P','Price']],对于所讨论的数据是否正确?是的,数据集是正确的,输出与以前的问题相同是的,添加了与以前相同的大小写和新字段。我无法无误地运行代码,存在vals=['I','Item'],['Q','Quantity'],['P','Price']?还添加了上一节中的一些代码。我尝试测试您的解决方案,但失败,。我使用I I U U df=df.我使用I I I I U U U I I I I I I I I U U U U U U U U I I I I U U U F=df.我使用I I I I I I I U U U U U U U F=df=df.我使用I I I I I I I I I I I I I I I I I I I I U U U U U U U U I I I I I I I I I I I I I I I I I U U U U U U U U U U U F=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=df=I['I’,'I’,'I’,'I’,'I’,'I’,'I_df['Description']=I_df['Description'].fillna'Description'vals=['I','Item'],['Q','Quantity'],['P','Price']],对于所讨论的数据是否正确?是的,数据集是正确的,输出与前面的问题一样。您的答案正确,适用于小数据。但是,如果我有一个大的数据集,那么这将需要很多时间。我尝试了10000个数据,这大约需要15分钟。有什么办法可以减少执行时间吗?L=[df1.loc[df1.index[[i]],x]。在vals1中为i,x设置_axisrangelenx,axis=1],这条特殊的行需要大量的时间来执行大型操作data@AtomStore-我认为这里有可能按堆栈优化解决方案-第一个解决方案来自,因为在这个解决方案中,循环的优化是非常困难的,我们的答案是正确的,适用于小数据。但是,如果我有一个大的数据集,那么这将需要很多时间。我尝试了10000个数据,这大约需要15分钟。有什么办法可以减少执行时间吗?L=[df1.loc[df1.index[[i]],x]。在vals1中为i,x设置_axisrangelenx,axis=1],这条特殊的行需要大量的时间来执行大型操作data@AtomStore-我认为这里有可能按堆栈优化解决方案-来自的第一个解决方案,因为在这个解决方案中有循环,优化非常困难
photo_df= df1.fillna('').filter(like='Photo')
photo_df = photo_df.fillna('')
product_df = df1.fillna('').filter(like='Description')
product_df = product_df.fillna('')
#assigned to vals1 for avoid overwrite `vals`
vals1 = [(i, y) for i, x in enumerate(photo_df.to_numpy())
for y in vals[:3] + [['PH',z]
for z in photo_df.columns[x!='']]]
#removed vals[:4] for avoid duplicated rows
vals2 = [(i, y) for i, x in enumerate(product_df.to_numpy())
for y in [['Descr',z]
for z in product_df.columns[x!='']]]
L = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals1]
#selected df1
M = [df1.loc[df1.index[[i]], x].set_axis(range(len(x)), axis=1) for i, x in vals2]
df = pd.concat(L)
df3 = pd.concat(M)
#sorting index by mergesort (only stable algo)
df = pd.concat([df,df3]).sort_index(kind='mergesort')
print (df)
0 1
0 I A
0 PH A1.jpg
0 PH A2.jpg
0 Description Nice
0 Description Beautiful
1 I B
1 PH B1.jpg
1 PH B2.jpg
1 PH B3.jpg
1 PH B4.jpg
1 Description Ugly
1 Description Damaged
2 I C
2 PH C1.jpg
2 Description Cute
2 Description Handsome
2 Description Nice