Python 2.7 如何将pandas数据帧与其自身合并,以具有唯一的标记行?

Python 2.7 如何将pandas数据帧与其自身合并,以具有唯一的标记行?,python-2.7,pandas,merge,Python 2.7,Pandas,Merge,给定一个数据帧: X = +---+----------+---------+ | | Value1 | Value2 | +---+----------+---------+ | A | 1 | NaN | | A | 2 | NaN | | B | 0 | 0 | +---+----------+---------+ 我如何将其与自身“合并”,以便去掉具有相同标签“A”的两行,并生成以下内容: X = +---

给定一个数据帧:

X =
+---+----------+---------+
|   | Value1   | Value2  |
+---+----------+---------+
| A |    1     |   NaN   |
| A |    2     |   NaN   |
| B |    0     |    0    |
+---+----------+---------+
我如何将其与自身“合并”,以便去掉具有相同标签“A”的两行,并生成以下内容:

X =
+---+----------+---------+----------+---------+
|   | Value1   | Value2  | Value1   | Value2  |
+---+----------+---------+----------+---------+
| A |    1     |   NaN   |    2     |   NaN   |
| B |    0     |    0    |   NaN    |   NaN   |
+---+----------+---------+----------+---------+

使用
cumcount

df.reset_index(inplace=True)
df['newkey']=df.groupby(df['index']).cumcount()
df.set_index(['index','newkey']).unstack().sort_index(level=1,axis=1)
Out[14]: 
       Value1 Value2 Value1 Value2
newkey      0      0      1      1
index                             
A         1.0    NaN    2.0    NaN
B         0.0    0.0    NaN    NaN

使用
cumcount

df.reset_index(inplace=True)
df['newkey']=df.groupby(df['index']).cumcount()
df.set_index(['index','newkey']).unstack().sort_index(level=1,axis=1)
Out[14]: 
       Value1 Value2 Value1 Value2
newkey      0      0      1      1
index                             
A         1.0    NaN    2.0    NaN
B         0.0    0.0    NaN    NaN
试试这个:

x['ind'] = x.index
x['test'] = x.groupby('ind')['Value1'].rank()
x = x[x['test'] == 1][['Value1', 'Value2']].merge(x[x['test'] != 1][['Value1', 'Value2']],
    left_index = True, right_index = True, how = 'outer')
输出:

   Value1_x  Value2_x  Value1_y  Value2_y
A         1       NaN       2.0       NaN
B         0       0.0       NaN       NaN
试试这个:

x['ind'] = x.index
x['test'] = x.groupby('ind')['Value1'].rank()
x = x[x['test'] == 1][['Value1', 'Value2']].merge(x[x['test'] != 1][['Value1', 'Value2']],
    left_index = True, right_index = True, how = 'outer')
输出:

   Value1_x  Value2_x  Value1_y  Value2_y
A         1       NaN       2.0       NaN
B         0       0.0       NaN       NaN

为什么要这样做?@BallpointBen下面的步骤是合并行索引上的数据帧,如果一个数据帧有重复的数据帧,这将无法正常工作。
pd.merge(left,right,how='left',left_Index=True,right_Index=True)
不起作用?@BallpointBen我想只有当它是唯一“正确”的数据帧,即具有非唯一行索引的数据帧时,它才起作用。在我的例子中,我有很多数据帧,无法检查哪些数据帧是好的,因此我需要一种方法来概括这种行为为什么要这样做?@BallpointBen下面的步骤是在行索引上合并数据帧,如果一个数据帧有重复的数据帧,这将无法正常工作。
pd.merge(左,右,how='left',左索引=真,右索引=真)
不起作用?@BallpointBen我想只有在“正确”的数据帧(具有非唯一行索引的数据帧)才起作用。在我的情况下,我有很多数据帧,无法检查哪些数据帧是好的,因此我需要一种方法来概括这种行为。这很好。但是结果数据帧的格式令人困惑。我如何转换数据帧将多索引返回到数据帧,删除新键名称?
df.columns=df.columns.get_level_values(0)
这很好。但是结果数据帧的格式令人困惑。如何将多索引转换回数据帧,删除新键名称?
df.columns=df.columns.get_level_values(0)
您可以替换
x['ind']=x.index;x['test']=x.groupby('ind')['Value1'].rank()
with
x['test']=x.groupby(level=0)['Value1'].rank()
其中
level=0
表示您在索引上分组。对于多索引,您可以指定
level=N
其中N是多索引的第N级。谢谢,@coldspeed!您可以替换
x['ind']=x.index;x['test']=x.groupby('ind')['Value1'].rank()
with
x['test']=x.groupby(level=0)['Value1'].rank()
其中
level=0
表示您在索引上分组。对于多索引,您可以指定
level=N
其中N是多索引的第N级。谢谢,@coldspeed!