Concat位于df python右侧的下一行

2024-04-29 19:42:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是使用一个条件来子集一个df,并将这些行附加到df的右侧。例如,当Num2等于1时,我想取下一行并将其附加到df的右侧。下面每行追加,其中我只想在Num2中的1之后追加下一行。我还希望能够附加特定的COL。使用下面的方法,这只能是Num1和Num2

df = pd.DataFrame({
            'Num1' : [0,1,2,3,4,4,0,1,2,3,1,1,2,3,4,0],
            'Num2' :  [0,0,0,0,0,1,3,0,1,2,0,0,0,0,1,4],
            'Value' :  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
             })

df1 = df.add_suffix('1').join(df.shift(-1).add_suffix('2'))

预期产出:

# grab all rows after a 1 in Num2
ones = df.loc[df["Num2"].shift().isin([1])]

# append these to the right
    Num1  Num2  Value  Num12  Num22
0      0     0      0
1      1     0      0
2      2     0      0
3      3     0      0
4      4     0      0
5      4     1      0      0      3      
6      0     3      0
7      1     0      0
8      2     1      0      3      2      
9      3     2      0
10     1     0      0
11     1     0      0
12     2     0      0
13     3     0      0
14     4     1      0      0      4      
15     0     4      0

Tags: 方法add目标dataframedfshiftvaluecol
3条回答

为此,我们可以创建前三个列的-1移位的新列,如果Num2不是1,则将它们设置为等于“”

mask = df.Num2 != 1
df[["Num12", "Num22"]] = df[["Num1", "Num2"]].shift(-1)
df.loc[mask, ["Num12", "Num22"]] = ""

我得到了一个警告,但是

>>> df[["Num12", "Num22"]] = np.where(df[['Num1', "Num2"]]['Num2'][:,np.newaxis] == 1, df[['Num1', 'Num2']].shift(-1), [np.nan, np.nan])
<stdin>:1: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
>>> df
    Num1  Num2  Value  Num12  Num22
0      0     0      0    NaN    NaN
1      1     0      0    NaN    NaN
2      2     0      0    NaN    NaN
3      3     0      0    NaN    NaN
4      4     0      0    NaN    NaN
5      4     1      0    0.0    3.0
6      0     3      0    NaN    NaN
7      1     0      0    NaN    NaN
8      2     1      0    3.0    2.0
9      3     2      0    NaN    NaN
10     1     0      0    NaN    NaN
11     1     0      0    NaN    NaN
12     2     0      0    NaN    NaN
13     3     0      0    NaN    NaN
14     4     1      0    0.0    4.0
15     0     4      0    NaN    NaN

您可以尝试:

df=df.join(df.shift(-1).mask(df['Num2'].ne(1)).drop('Value',1).add_suffix('2')) 

ones.index=ones.index-1
df=df.join(ones.drop('Value',1).add_suffix('2'))
#OR(use any 1 since both method doing the same thing)
df=pd.concat([df,ones.drop('Value',1).add_suffix('2')],axis=1)

如果需要,使用fillna()

df[["Num12", "Num22"]]=df[["Num12", "Num22"]].fillna('')

相关问题 更多 >