Skip to content

Commit 942212e

Browse files
committed
FIX apply with an empty dataframe
1 parent 4c10ebf commit 942212e

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

pandas/core/frame.py

+21-11
Original file line numberDiff line numberDiff line change
@@ -1693,7 +1693,9 @@ def info(self, verbose=True, buf=None, max_cols=None):
16931693

16941694
@property
16951695
def dtypes(self):
1696-
return self.apply(lambda x: x.dtype)
1696+
dtypes = self.apply(lambda x: x.dtype)
1697+
dtypes.name = 'dtypes'
1698+
return dtypes
16971699

16981700
def convert_objects(self, convert_dates=True, convert_numeric=False, copy=True):
16991701
"""
@@ -4395,20 +4397,28 @@ def apply(self, func, axis=0, broadcast=False, raw=False,
43954397
return self._constructor(data=results, index=self.index,
43964398
columns=self.columns, copy=False)
43974399
else:
4400+
#if not all(self.shape):
4401+
# broadcast = True
4402+
43984403
if not broadcast:
43994404
if not all(self.shape):
4400-
# How to determine this better?
4401-
is_reduction = False
4402-
try:
4403-
is_reduction = not isinstance(f(_EMPTY_SERIES),
4404-
np.ndarray)
4405-
except Exception:
4406-
pass
4405+
if axis:
4406+
result = self._constructor([f(self.iloc[i, :])
4407+
for i, _ in enumerate(self.index)],
4408+
index=self.index)
4409+
else:
4410+
result = self._constructor([f(self.iloc[:, i])
4411+
for i, _ in enumerate(self.columns)],
4412+
index=self.columns)
4413+
4414+
# are these the only cases when we flatten?
4415+
if len(result.columns) == 1:
4416+
return result.iloc[:, 0]
44074417

4408-
if is_reduction:
4409-
return Series(NA, index=self._get_agg_axis(axis))
4418+
elif not len(result.index):
4419+
return Series(NA, index=result.columns)
44104420
else:
4411-
return self.copy()
4421+
return result
44124422

44134423
if raw and not self._is_mixed_type:
44144424
return self._apply_raw(f, axis)

pandas/tests/test_frame.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -5443,6 +5443,12 @@ def test_dtypes(self):
54435443
index=result.index)
54445444
assert_series_equal(result, expected)
54455445

5446+
# GH4272
5447+
df = DataFrame(columns=list('xyz'))
5448+
res = df.dtypes
5449+
exp = Series((df.iloc[:, i].dtype for i, _ in enumerate(df.columns)), index=df.columns, name='dtypes')
5450+
assert_series_equal(res, exp)
5451+
54465452
def test_convert_objects(self):
54475453

54485454
oops = self.mixed_frame.T.T
@@ -8017,9 +8023,16 @@ def test_apply_empty(self):
80178023
assert_series_equal(result, expected)
80188024

80198025
# 2476
8020-
xp = DataFrame(index=['a'])
8021-
rs = xp.apply(lambda x: x['a'], axis=1)
8022-
assert_frame_equal(xp, rs)
8026+
df = DataFrame(index=['a'])
8027+
rs = df.apply(lambda x: x['a'], axis=0)
8028+
xp = df.loc['a']
8029+
xp.name = None
8030+
assert_series_equal(xp, rs)
8031+
8032+
df = DataFrame(columns=['A'])
8033+
expected = Series(2, ['A'])
8034+
result = df.apply(lambda x: 2)
8035+
assert_series_equal(expected, result)
80238036

80248037
def test_apply_standard_nonunique(self):
80258038
df = DataFrame(

0 commit comments

Comments
 (0)