Reputation: 8816
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:
.iloc
can either return a Series or a Data Frame, forcing me to manually check for this in my code- (wrong info, as pointed out in the comment).loc
, on the other hand, always return a Data Frame, making pandas
inconsistent within itself
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
Reputation: 11
For getting single row extraction from Dataframe use:
df_name.iloc[index,:].to_frame().transpose()
Upvotes: 1
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
Reputation: 17
single_Sample1=df.iloc[7:10]
single_Sample1
[1]: https://i.sstatic.net/RHHDZ.png**strong text**
Upvotes: -1
Reputation: 402844
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
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
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
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