Python 分组数据帧,因为它们有一些共同点
我有一个超过1000行的熊猫数据帧,看起来有点像这样:Python 分组数据帧,因为它们有一些共同点,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个超过1000行的熊猫数据帧,看起来有点像这样: Copy name type ntv G1 BA X 0.45 G1 BB X 0.878 G1 C Z 0.19 G1 LA1 Y 1.234 G1 L Y 0.09 G1 LB Y
Copy name type ntv
G1 BA X 0.45
G1 BB X 0.878
G1 C Z 0.19
G1 LA1 Y 1.234
G1 L Y 0.09
G1 LB Y 1.056
F2 BA1 X -7.890
F2 BB X 2.345
F2 MA Y -0.871
F2 LB1 Y 0.737
在上面的示例(df1)中,有两组具有不同名称的“复制”列G1和F2,以及三种类型X、Y和Z
我想创建另一个数据帧(df2),看起来像下面的一个,它们以X-Y或Z-Y的形式分组在一起
Model ntv_1 ntv_2
G1BA-LA1 0.45 1.234
G1BB-LB 0.878 1.056
G1C-L 0.19 0.09
F2BA1-MA -7.890 -0.871
F2BB-LB1 2.345 0.737
对于X-Y组,它们有共同的第二个字符df1['name']。因此,我决定这样做:
c = df1[(df1['name'].str[0]=='B' & (df1['ntv'] != 0.0)]
h = df1[((df1['name'].str[0]=='L')|(df1['name'].str[0]=='M')) & (df['ntv'] != 0.0)]
b = (c.loc[:,c['name'].str[1]] == h.loc[:,h['name'].str[1]]).groupby('Copy')
df2['Model'] = c['Copy'].astype(str) + c['name'].astype(str) + '-' + h['name'].astype(str)
df2['ntv_1'] = c['ntv']
df2['ntv_2'] = h['ntv']
我收到一条错误信息。所以我决定这样做:
ca = c['name'].str[1].dropna()
ha = h['name'].str[1].dropna()
if ca == ha:
df2['Model'] = c['Copy'].astype(str) + c['name'].astype(str) + '-' + h['name'].astype(str)
df2['ntv_1'] = c['ntv']
df2['ntv_2'] = h['ntv']
但我得到了一个ValueError:“序列长度必须匹配才能进行比较。”
请问如何将数据帧分组为X-Y或Z-Y格式?提前谢谢 存在问题
c
和h
未对齐,因为不同的指数和可能不同的长度:
#added condition for remove all rows with no second value in name
c = df1[(df1['name'].str[0]=='B') & (df1['ntv'] != 0.0) &
(df1['name'].str[1].notnull())].copy()
#created MultiIndex for align with Counter duplicates
ca = c['name'].str[1]
c.index = [ca, c.groupby(ca).cumcount()]
#added condition for remove all rows with no second value in name
h = df1[((df1['name'].str[0]=='L')|(df1['name'].str[0]=='M')) &
(df1['ntv'] != 0.0) & (df1['name'].str[1].notnull())].copy()
#created MultiIndex for align with Counter duplicates
ha = h['name'].str[1]
h.index = [ha, h.groupby(ha).cumcount()]
print (c)
copy name type ntv
name
A 0 G1 BA X 0.450
B 0 G1 BB X 0.878
A 1 F2 BA1 X -7.890
B 1 F2 BB X 2.345
print (h)
copy name type ntv
name
A 0 G1 LA1 Y 1.234
B 0 G1 LB Y 1.056
A 1 F2 MA Y -0.871
B 1 F2 LB1 Y 0.737
为什么BB和LB搭配而不是L?@ScottBoston这是因为df['name']中的单个字符是成对的,只要它们在同一个“副本”中就可以了。这就是为什么“C”与“L”成对出现的原因。另外,X型通常以字母“B”开头,而Y型通常以字母“L”或“M”开头。你是个救命恩人。非常感谢你!它像魔术一样工作,非常感谢你的评论。他们真的很有帮助!我发现,即使我打开一个新的python文件并只编写一段代码来重命名列,也不可能单独重命名这些列。列“ntv_2”总是在我为列1指定的名称后附加足够的“_2”。我理解这就是你在代码中所做的。但我的问题是,为什么即使在保存数据帧并在另一个python文件中重新打开它之后,它仍然会重复出现。当我使用
df.rename()
时,收到一条“无”消息。因此,我使用了df.columns.str.replace('ntv_2','a2')
,但该列没有重命名为a2……它通常重命名为另一列的名称,并且足够了。我知道这是一个微不足道的问题,但我只是好奇,想知道为什么会这样。提前谢谢!嗯,对我来说总是工作得很完美df=df.rename(columns={'ntv_2':'a2'})
,你能试试吗?我做的是df=df.rename(columns={'ntv_2':'a2'},inplace=True)
。我取出了inplace=True
,它现在可以工作了。非常感谢。
#join together DataFrames
df2 = pd.concat([c, h.add_suffix('_2')], axis=1)
#with real data is possible data are not aligned and get NaNs
#for remove all NaNs rows use
#df2 = df2.dropna()
df2['Model'] = df2['copy'].astype(str)+df2['name'].astype(str)+'-'+ df2['name_2'].astype(str)
#filter columns and remove MultiIndex
df2 = df2[['Model','ntv','ntv_2']].reset_index(drop=True)
print (df2)
Model ntv ntv_2
0 G1BA-LA1 0.450 1.234
1 G1BB-LB 0.878 1.056
2 F2BA1-MA -7.890 -0.871
3 F2BB-LB1 2.345 0.737