使用常见列值作为数据帧的索引来设置索引

时间:2019-08-19 14:44:52

标签: python pandas dataframe

我有一个df,如下所示:

ID  MAHACEB ID  MOROPEX ID  OTX01   ID  MAPOXUB
A0AVT1  48  A0AVT1  23  A0A0B4J2F0  22  A0AVT1  38
A0FGR8  35  A0FGR8  19  A0A0U1RRE5  3   A0FGR8  10
A0JLT2  28  A0JLT2  50  A0A1B0GUS4  10  A0JLT2  56
A0JNW5  35  A0JNW5  23  A0AV96      71  A0JNW5  26
A0MZ66  37  A0MZ66  98  A0AVF1      40  A0MZ66  21
A0PJW6  48  A0PJW6  27  A0AVT1      12  A0PJW6  29

如果ID的值在所有列中都是通用的,我想使用ID作为索引,或者对于缺少ID值的列用NA填充。

我尝试了以下一种衬垫:

df = df.drop_duplicates(subset='ID', keep='first').set_index('ID')

这导致将ID中的值列表作为行值。

最后,我想要一个看起来像这样的数据框: 使用ID作为索引,所有其他列作为列。用NA填充缺失值。

换句话说,如果ID在各列之间是公用的,则用NA填充值,否则用ID MAHACEB MOROPEX OTX01 MAPOXUB A0AVT1 48 23 NA 38 A0A0B4J2F0 NA NA 22 NA A0A0U1RRE5 NA NA 33 NA A0A1B0GUS4 NA NA 10 NA A0FGR8 35 19 NA 10 A0JLT2 28 50 NA 56 A0JNW5 35 23 NA 26 A0AV96 NA NA 71 NA A0MZ66 37 98 NA 21 A0AVF1 NA NA 40 NA A0PJW6 48 27 NA 29 A0AVT1 NA NA 12 NA

struct names {
    var id = 0
    var name = ""
}

var demoData = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]

struct SelectionDemo : View {
    @State var selectKeeper = Set<String>()

    var body: some View {

        HStack {
            List(demoData, id: \.self, selection: $selectKeeper){ name in
                Text(name)
            }.frame(width: 500, height: 460)
        }
    }
}

#if DEBUG
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            SelectionDemo()
        }
    }
#endif

2 个答案:

答案 0 :(得分:1)

您的DataFrame不容易使用,因为列名不是唯一的。您应该使用IDKey列(其值为MAHACEBMOROPEX等,以及Value)将表重塑为适当的格式。然后,您可以通过简单的操作获得结果。

假设列名在IDKey之间变化,您可以这样做

# Bring your frame into normalized format
df2 = pd.DataFrame()
for i in range(len(df.columns)//2):
    key = df.columns[2*i+1]
    dfx = pd.DataFrame()
    dfx['ID'] = df.iloc[:,2*i]
    dfx['Key'] = key
    dfx['Value'] = df.iloc[:,2*i+1]
    df2=pd.concat([df2,dfx], sort=False)

# Pivot
df_res = df2.pivot(index='ID', columns='Key', values='Value')

答案 1 :(得分:-1)

答案非常简单。这样做:

df.sort_values('ID', inplace = True)

这是什么,因为inplace参数为True,所以它根据ID属性/字段对数据帧进行排序并保存排序顺序。 请查看以下示例:

data = pd.read_csv("airfoil_self_noise.csv")
data.head()

输出为: A 现在您可以看到Free_stream_velocity具有重复的值。以下是我对数据进行排序的方式。

data.sort_values('Free_stream_velocity', inplace = True)
data.head()

以下是输出: enter image description here