Repeating elements in a data frame

Hi everyone I have the following dataframe:

A | B | C
1   2   3 
2   3   4 
3   4   5
4   5   6

      

And I am trying to only iterate over the last two lines of data so that they look like this:

A | B | C
1   2   3 
2   3   4 
3   4   5
3   4   5
4   5   6
4   5   6

      

I have tried using append, concat and repeating to no avail.

repeated = lambda x:x.repeat(2)
df.append(df[-2:].apply(repeated),ignore_index=True)

      

This returns the following dataframe, which is invalid:

A | B | C
1   2   3 
2   3   4 
3   4   5
4   5   6
3   4   5
3   4   5
4   5   6
4   5   6

      

+3


source to share


3 answers


You can use numpy.repeat

to iterate over the index and then create df1

by loc

, the last one is appended to the original, but before filtering the last 2 rows iloc

:

df1 = df.loc[np.repeat(df.index[-2:].values, 2)]
print (df1)
   A  B  C
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

print (df.iloc[:-2])
   A  B  C
0  1  2  3
1  2  3  4

df = df.iloc[:-2].append(df1,ignore_index=True)
print (df)
   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
3  3  4  5
4  4  5  6
5  4  5  6

      



If you want to use your code, add iloc

only the last two lines to filter:

repeated = lambda x:x.repeat(2)
df = df.iloc[:-2].append(df.iloc[-2:].apply(repeated),ignore_index=True)
print (df)
   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
3  3  4  5
4  4  5  6
5  4  5  6

      

+2


source


Use pd.concat

and slice the index with .iloc

:

pd.concat([df,df.iloc[-2:]]).sort_values(by='A')

      



Output:

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

      

+2


source


I am incomplete to manipulate the index into the template we are targeting and then requesting the dataframe to take a new shape.

Option 1
Use pd.DataFrame.reindex

df.reindex(df.index[:-2].append(df.index[-2:].repeat(2)))

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

      

The same thing on a few lines

i = df.index
idx = i[:-2].append(i[-2:].repeat(2))
df.reindex(idx)

      

You can also use loc

i = df.index
idx = i[:-2].append(i[-2:].repeat(2))
df.loc[idx]

      


Option 2
Recover from values

. Only this is all dtypes

the same.

i = np.arange(len(df))
idx = np.append(i[:-2], i[-2:].repeat(2))
pd.DataFrame(df.values[idx], df.index[idx])

   0  1  2
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

      


Option 3
Can also be used np.array

iniloc

i = np.arange(len(df))
idx = np.append(i[:-2], i[-2:].repeat(2))
df.iloc[idx]

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

      

+2


source







All Articles