Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从列表列的值创建新行_Python_Pandas - Fatal编程技术网

Python:从列表列的值创建新行

Python:从列表列的值创建新行,python,pandas,Python,Pandas,我有一个熊猫数据框,看起来像这样: tags value [tag1, tag2, tag3] 0 [tag2, tag3] 10 [tag1, tag3] 50 ... 在这个数据帧上,我想应用一个函数,对于每行的每个标记,将创建一个新行,其中包含一列“tag”和一列“related_tags”。 以下是我所期望的一个例子: tag value r

我有一个熊猫数据框,看起来像这样:

              tags   value
[tag1, tag2, tag3]       0
[tag2, tag3]            10
[tag1, tag3]            50
                       ...
在这个数据帧上,我想应用一个函数,对于每行的每个标记,将创建一个新行,其中包含一列“tag”和一列“related_tags”。 以下是我所期望的一个例子:

 tag   value    related_tags
tag1       0    [tag2, tag3] 
tag2       0    [tag1, tag3] 
tag3       0    [tag1, tag2] 
tag2      10    [tag3]     
tag3      10    [tag2]    
tag1      50    [tag3]   
tag3      50    [tag1]
我熟悉Spark DataFrames,但不熟悉Pandas,有没有一种简单的方法来实现这一点?

这是一个问题首先,在分解列表列
标记之后,问题就更清楚了

newdf=unnesting(df,['tags']).reset_index()

newdf['related_tags']=newdf['index'].map(df.tags)

newdf['related_tags']=[list(set(y)-{x})for x , y in zip(newdf.tags,newdf.related_tags)]
newdf
Out[48]: 
   index  tags  value  related_tags
0      0  tag1      0  [tag2, tag3]
1      0  tag2      0  [tag3, tag1]
2      0  tag3      0  [tag2, tag1]
3      1  tag2     10        [tag3]
4      1  tag3     10        [tag2]

数据输入

df=pd.DataFrame({'tags':[['tag1','tag2','tag3'],['tag2','tag3']],'value':[0,10]})

自我定义

这可能有帮助。
def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')