根据列值合并2个数据框

时间:2020-05-18 17:38:19

标签: python regex pandas split

您好,我有一个数据框,例如:

Df1

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?selectableItemBackground"
    app:cardCornerRadius="3dp"
    app:cardElevation="5dp"
    app:cardUseCompatPadding="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">


        <LinearLayout
            android:id="@+id/linear_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_toLeftOf="@+id/linear_layout_2"
            android:clickable="true"
            android:focusable="true"
            android:orientation="vertical">


            <TextView
                android:id="@+id/eventTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:textColor="@color/colorBlack"
                android:textSize="18sp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/eventDes"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/eventAttendee"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/eventStart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/eventEnd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:visibility="gone" />

            <TextView
                android:id="@+id/eventLocation"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="12dp"
                android:visibility="gone" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/linear_layout_2"
            android:layout_width="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        <ImageView
            android:id="@+id/delete"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:clickable="true"
            android:focusable="true"
            android:tint="@color/colorBlack"
            app:srcCompat="@drawable/ic_baseline_delete_24" />

        <ProgressBar
            android:id="@+id/progress_circular"
            android:layout_centerVertical="true"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_alignParentEnd="true"
            android:visibility="gone" />

       </LinearLayout>

    </RelativeLayout>
</androidx.cardview.widget.CardView>

和另一个df,例如:

df2

Groups   Names                          COLs  COLe
G1     ABC_DEF.1:2-300():Canis_lupus    2     300
G1     SEQUENCE1                        NA    NA
G1     SEQUENCE2                        NA    NA
G1     SEQUENCE3                        NA    NA
G1     ABC_DEF.1:400-600():Canis_lupus  400   600
G1     IJK_LMN.1:20-200():Bos_taurus    20    200
G2     OP_D:500-1000():Felis_catus      500   1000
G2     Sequence3                        NA    NA

并且想法是创建一个将在所有数据框之间合并的新df

这是预期的结果

COL1       COL2       COL3 COL4 COL5 COL6 Species
ABC_DEF.1  SEQUENCE1  20   80   A    1    Canis_lupus
ABC_DEF.1  SEQUENCE2  500  548  C    3    Canis_lupus
QKC_DEF.2  SEQUENCE2  500  548  Z    O    Canis_lupus
ABC_DEF.1  SEQUENCE4  520  800  T    9    Canis_lupus
IJK_LMN.1  SEQUENCE1  10   18   D    4    Bos_taurus
AQK_LM9.1  SEQUENCE1  10   18   P    5    Bos_taurus
IJK_LMN.1  SEQUENCE1  30   50   U    0    Bos_taurus
IJK_LMN.1  SEQUENCE3  30   176  E    5    Bos_taurus
OP_D       SEQUENCE3  600  700  F    6    Felis_catus
OP_D       SEQUENCE1  539  878  G    7    Felis_catus
OP_S       SEQUENCE4  20   78   H    8    Felis_catus

想法是解析Groups Names COL2 COL3 COL4 COL5 COL6 G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1 G1 ABC_DEF.1:400-600():Canis_lupus SEQUENCE2 500 548 B 2 G1 IJK_LMN.1:20-200():Bos_taurus SEQUENCE1 30 50 U 0 G1 IJK_LMN.1:20-200():Bos_taurus SEQUENCE3 30 176 E 5 G2 OP_D:500-1000():Felis_catus SEQUENCE3 600 700 F 6 中的每个Groups 让我们以Df1为例:

G1ABC_DEF.1:2-300():Canis_lupus中,

然后,如果我有df2对应于df中存在的元素,我将调查该COL2

我有NamesSEQUENCE1属于同一组:

然后如果SEQUENCE2COL3COL4-COLs(此处为Cole)之间,

所以2-300SEQUENCE1,然后将行添加到新的df中:

20-80

Groups Names COL2 COL3 COL4 COL5 COL6 G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1 SEQUENCE2,因此它位于500-548上方

然后我对2-300中的第二个名字感兴趣:G1

再次有ABC_DEF.1:400-600():Canis_lupusSEQUENCE1,但是这里只有SEQUENCE2SEQUENCE2范围内,因此我只添加了这一个

400-600

现在Groups Names COL2 COL3 COL4 COL5 COL6 G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1 G1 ABC_DEF.1:400-600():Canis_lupus SEQUENCE2 500 548 B 2 ,我到了IJK_LMN.1:20-200():Bos_taurus

df2对应并且在SEQUENCE1范围

20-200

有人对熊猫和蟒蛇有想法吗?

我想我们应该使用合并和拆分名称来获取每个部分:

例如:

Groups Names                            COL2        COL3 COL4 COL5 COL6
G1     ABC_DEF.1:2-300():Canis_lupus   SEQUENCE1   20   80   A    1
G1     ABC_DEF.1:400-600():Canis_lupus SEQUENCE2   500  548  B    2
G1     IJK_LMN.1:20-200():Bos_taurus   SEQUENCE1   30   50   U    0

将必须分为:

  1. ABC_DEF.1(第一个ABC_DEF.1:2-300():Canis_lupus 之前的所有内容)
  2. Canis_lupus(在最后一个:之后)

1 个答案:

答案 0 :(得分:0)

首先,您应该考虑采取以下步骤:

1-从df1中删除仅包含SEQUENCE1,SEQUENCE2等的行。据我了解,它们没有用,因为没有范围和具体名称。 2-从列Names

中删除第一个':'之后的所有内容

然后,您可以执行以下操作:

3-使用pandas.merge合并两个数据框:

df_merged = pd.merge(df1,df2, how = 'inner', left_on = 'Name', right_on = 'COL1')

4-根据您在COL3COL4之间对COLsCOLe所说的条件,过滤出结果数据框。

当您像这样进行内部联接时,由于COL1的COL2值(序列)不止一个,因此您将得到重复的结果。因此,您可以根据所需条件轻松过滤出正确的结果。

您可以在此处查看有关与熊猫进行SQL比较的更多信息:

https://pandas.pydata.org/docs/getting_started/comparison/comparison_with_sql.html

请让我知道我的回答是否有帮助。