Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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_Dataframe - Fatal编程技术网

Python 组合数据帧

Python 组合数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我对熊猫很陌生。所以请容忍我。我有一个像这样的df DF1 column1 column2(ids) a [1,2,13,4,9] b [20,14,10,18,17] c [6,8,12,16,19] d [11,3,15,7,5] 每个列表中的每个数字对应于第二个数据帧中的列id DF2 id. value_to_change. 1 x1 2 x2 3 x3 4

我对熊猫很陌生。所以请容忍我。我有一个像这样的df

DF1
column1     column2(ids)   
a          [1,2,13,4,9]
b          [20,14,10,18,17]
c          [6,8,12,16,19]
d          [11,3,15,7,5]
每个列表中的每个数字对应于第二个数据帧中的列id

DF2
id.  value_to_change. 
1      x1
2      x2
3      x3
4      x4
5      x5
6      x6
7      x7
8      x8
9      x9 
.      .
.      .
.      .
20    x20
步骤1

  • 我想迭代每个列表,用匹配的ID选择DF2中的行,并创建4个数据帧,因为我在DF1中有4行。 如何做到这一点
  • 例如,对于应用逻辑后的第一行,我会得到这个

     id.    value_to_change
        1      x1
        2      x2
        13     x13
        14     x14
        9      x9
    
    第二排会给我

      id.     value_to_change
        20      x20
        14      x14
        10      x10
        18      x18
        17      x17
    
    等等

    步骤2

    一旦我有了这4个数据帧,我将它们作为参数传递给一个逻辑,该逻辑返回4个数据帧。 2) 我怎样才能把它们组合成一个排序的最后一个呢

    DF3
    id.  new_value
    1      y1
    2      y2
    3      y3
    4      y4
    5      y5
    6      y6
    7      y7
    8      y8
    9      y9 
    .      .
    .      .
    .      .
    20    y20
    

    我怎样才能做到这一点呢?

    首先,这段代码应该满足您的要求

    import pandas as pd
    
    idxs = [
        [0,2],
        [1,3],
    ]
    
    df_idxs = pd.DataFrame({'idxs': idxs})
    
    df = pd.DataFrame(
        {'data': ['a', 'b', 'c', 'd']}
    )
    
    frames = []
    for _, idx in df_idxs.iterrows():
        rows = idx['idxs']
        frame = df.loc[rows]
        # some logic
        print(frame)
        #collect
        frames.append(frame)
        
    pd.concat(frames)
    
    请注意,熊猫会自动创建一个范围索引,如果传递的是none。如果要选择其他列,请将该列设置为索引,或使用

    df.loc[df.data.isin(rows)]
    

    split apply联合收割机上的熊猫文档也可能会引起您的兴趣:

  • 使用
    .loc
    .isin
    df2
  • 在这4个数据帧上执行您的逻辑
  • 使用
    pandas.concat()
  • 使用
    .sort\u values()
  • 代码:

    将熊猫作为pd导入
    df1=pd.DataFrame({'column1':['A','B','C','D','ids':[[1,2,13,4,9],[20,14,10,18,17],[6,8,12,16,19],[11,3,15,7,5]})
    df2=pd.DataFrame({'ids':list(范围(1,21)),'val':[f'x{x}表示范围(1,21)]中的x)
    df_列表=[]
    对于df1['ids']中的id_列表。值:
    df_list.append(df2.loc[df2['id'].isin(id_list)])
    #在DF_列表中对每个DF执行逻辑
    #假设df_列表现在包含结果数据帧
    df3=pd.concat(df_列表)
    df3=df3.sort_值('id'))
    
    此代码将有助于解决问题的第一部分

    import pandas as pd
    df1 = pd.DataFrame([[[1,2,4,5]],[[3,4,1]]], columns=["column2(ids)"])
    df2 = pd.DataFrame([[1,"x1"],[2,"x2"],[3,"x3"],[4,"x4"],[5,"x5"]], columns=["id", "value_to_change"])
    df3 = pd.DataFrame(columns=["id", "value_to_change"])
    for row in df1.iterrows():
        s = row[1][0]
        for item in s:
            val = df2.loc[df2['id']==item, 'value_to_change'].item()
            df_temp = pd.DataFrame([[item,val]], columns=["id", "value_to_change"])
            df3 = df3.append(df_temp, ignore_index=True)
    df3
    
    注意在
    s=row[1][0]
    行中,您需要根据您的数据帧选择索引,在我的例子中,它是
    [1][0]

    -对于第二部分,您可以使用
    pd.concat


    -对于排序
    df.sort\u值

    使用这样的单个数据帧将更容易、更有效

    初始化

    df1 = pd.DataFrame({'label': ['A', 'B', 'C', 'D'], 'ids': [[1,2,13,4,9], 
    [20,14,10,18,17], [6,8,12,16,19],[11,3,15,7,5]]})
    
    # Some custom function for dataframe operations
    def my_func(x):
         x['value_to_change'] = x.value_to_change.str.replace('x', 'y') 
         return x
    
    数据帧操作

    df1 = df1.explode('ids')
    df1['value_to_change'] = df1.explode('ids')['ids'].map(dict(zip(df2.ids, df2.val)))
    df1['new_value'] = df1.groupby('label').apply(my_func)['value_to_change']
    
    输出

      label ids value_to_change new_value
    0     A   1              x1        y1
    0     A   2              x2        y2
    0     A  13             x13       y13
    0     A   4              x4        y4
    0     A   9              x9        y9
    1     B  20             x20       y20
    1     B  14             x14       y14
    1     B  10             x10       y10
    1     B  18             x18       y18
    1     B  17             x17       y17
    2     C   6              x6        y6
    2     C   8              x8        y8
    2     C  12             x12       y12
    2     C  16             x16       y16
    2     C  19             x19       y19
    3     D  11             x11       y11
    3     D   3              x3        y3
    3     D  15             x15       y15
    3     D   7              x7        y7
    3     D   5              x5        y5
    

    在手机上,因此无法测试。您可以使用DF2.loc中的每个列表来选择行。可以使用pd.concat进行最终组合。您的数据不一致。请正确格式化。@Vishnudev有什么不一致的地方吗??无论如何,我想你明白了,我觉得我的格式很好。如果你想编辑你的数据中有点
    ,这是有意的吗?@Vishnudev不要吝啬,问题很清楚。虽然uniXVanXcel可以包含生成这些数据帧的代码。谢谢,请让我理解并将其与我的案例相匹配,然后再与您联系。谢谢,我最终使用了他的解决方案,因为它更具可读性,但谢谢您的帮助。您不需要内部循环。只需使用df中的列表。loc@AlexNe如何在没有内部循环的情况下访问列表中的各个元素?可以使用df.loc[s]访问它们这可能是最好的答案