Heisenberg
Heisenberg

Reputation: 8816

Forcing pandas .iloc to return a single-row dataframe?

For programming purpose, I want .iloc to consistently return a data frame, even when the resulting data frame has only one row. How to accomplish this?

Currently, .iloc returns a Series when the result only has one row. Example:

In [1]: df = pd.DataFrame({'a':[1,2], 'b':[3,4]})

In [2]: df
Out[2]:
   a  b
0  1  3
1  2  4

In [3]: type(df.iloc[0, :])
Out[3]: pandas.core.series.Series

This behavior is poor for 2 reasons:

- .loc, on the other hand, always return a Data Frame, making pandas inconsistent within itself (wrong info, as pointed out in the comment)

For the R user, this can be accomplished with drop = FALSE, or by using tidyverse's tibble, which always return a data frame by default.

Upvotes: 150

Views: 85705

Answers (6)

Vishal
Vishal

Reputation: 11

For getting single row extraction from Dataframe use:

df_name.iloc[index,:].to_frame().transpose()

Upvotes: 1

etotheipi
etotheipi

Reputation: 906

The double-bracket approach doesn't always work for me (e.g. when I use a conditional to select a timestamped row with loc).

You can, however, just add to_frame() to your operation.

>>> df = pd.DataFrame({'a':[1,2], 'b':[3,4]})

>>> df2 = df.iloc[0, :].to_frame().transpose()

>>> type(df2)
<class 'pandas.core.frame.DataFrame'>

Upvotes: 6

Satyendra Jaiswal
Satyendra Jaiswal

Reputation: 17

single_Sample1=df.iloc[7:10]
single_Sample1

[1]: https://i.sstatic.net/RHHDZ.png**strong text**

Upvotes: -1

cs95
cs95

Reputation: 402844

Accessing row(s) by label: loc

# Setup
df = pd.DataFrame({'X': [1, 2, 3], 'Y':[4, 5, 6]}, index=['a', 'b', 'c'])
df        

   X  Y
a  1  4
b  2  5
c  3  6

To get a DataFrame instead of a Series, pass a list of indices of length 1,

df.loc[['a']]
# Same as
df.loc[['a'], :] # selects all columns

   X  Y
a  1  4

To select multiple specific rows, use

df.loc[['a', 'c']] 

   X  Y
a  1  4
c  3  6

To select a contiguous range of rows, use

df.loc['b':'c'] 

   X  Y
b  2  5
c  3  6

Access row(s) by position: iloc

Specify a list of indices of length 1,

i = 1
df.iloc[[i]]

   X  Y
b  2  5

Or, specify a slice of length 1:

df.iloc[i:i+1] 

   X  Y
b  2  5

To select multiple rows or a contiguous slice you'd use a similar syntax as with loc.

Upvotes: 29

priyankar sinha
priyankar sinha

Reputation: 21

please use the below options:

df1 = df.iloc[[0],:]
#type(df1)
df1

or

df1 = df.iloc[0:1,:]
#type(df1)
df1

Upvotes: 2

Scott Boston
Scott Boston

Reputation: 153500

Use double brackets,

df.iloc[[0]]

Output:

   a  b
0  1  3

print(type(df.iloc[[0]])

<class 'pandas.core.frame.DataFrame'>

Short for df.iloc[[0],:]

Upvotes: 238

Related Questions