我有一个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
答案 0 :(得分:1)
您的DataFrame不容易使用,因为列名不是唯一的。您应该使用ID
,Key
列(其值为MAHACEB
,MOROPEX
等,以及Value
)将表重塑为适当的格式。然后,您可以通过简单的操作获得结果。
假设列名在ID
和Key
之间变化,您可以这样做
# 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)