我是python的新手,我有一个可能很愚蠢的问题,但我坚持不懈,感谢任何帮助。
我有一个数据框A.在A的某些条目中有一个给定的范围(例如:'1,0 - 2,0')。我想在每个条目中取最大值(在我们的例子中:'2,0')。
我尝试了两个for-loops
nrow = A.shape[0]-1
ncol = A.shape[1]-1
for i in range(0,nrow):
for j in range(0,ncol):
if "-" in A[i,j]:
A[i,j]= A[i,j].split(' - ')[1]
但是我收到了这个错误:KeyError:(0,0)。
问题: 有没有更优雅的方法来解决我的问题? 我的解决方案有什么问题?
答案 0 :(得分:0)
您可以使用lambda函数
A['column']=A['column'].apply(lambda x: x.split('-')[1])
答案 1 :(得分:0)
我认为您的分割实际上工作正常,但您在A中缺少(0,0)的条目。在错误消息中,它表示问题是使用密钥(0,0)。
如果您在分割中遇到[1]
问题,则会出现IndexError: list index out of range
错误。
答案 2 :(得分:0)
我认为你可以使用:
stack
A
至Series
contains
和boolean indexing
-
的值
split
值,A2
参数创建expand=True
,replace
,
创建.
,如有必要,转换为float
按astype
并按max
unstack
至A2
A2
中的缺失值替换为combine_first
的值A
。np.random.seed(34)
L = ['1,0 - 2,0','3,0 - 2,0','4,0 - 6,0', 5.0, 'a', 'c']
A = pd.DataFrame(np.random.choice(L, size=(5,5)), columns=list('abcde'))
print (A)
a b c d e
0 3,0 - 2,0 4,0 - 6,0 4,0 - 6,0 3,0 - 2,0 c
1 a 5.0 c 5.0 4,0 - 6,0
2 c 4,0 - 6,0 c 3,0 - 2,0 1,0 - 2,0
3 c c a c 1,0 - 2,0
4 c a 5.0 5.0 c
A1 = A.stack()
A2 = A1[A1.str.contains(' - ')]
A2 = A2.str.split(' - ', expand=True)
.replace(',', '.', regex=True)
.astype(float)
.max(axis=1)
.unstack()
print (A2)
a b c d e
0 3.0 6.0 6.0 3.0 NaN
1 NaN NaN NaN NaN 6.0
2 NaN 6.0 NaN 3.0 2.0
3 NaN NaN NaN NaN 2.0
A = A2.combine_first(A)
print (A)
a b c d e
0 3 6 6 3 c
1 a 5.0 c 5.0 6
2 c 6 c 3 2
3 c c a c 2
4 c a 5.0 5.0 c
如果范围的第二个值始终为max
:
A1 = A.stack()
A2 = A1[A1.str.contains(' - ')]
A2 = A2.str.split(' - ').str[1].replace(',','.', regex=True).astype(float).unstack()
print (A2)
a b c d e
0 2.0 6.0 6.0 2.0 NaN
1 NaN NaN NaN NaN 6.0
2 NaN 6.0 NaN 2.0 2.0
3 NaN NaN NaN NaN 2.0
A = A2.combine_first(A)
print (A)
a b c d e
0 2 6 6 2 c
1 a 5.0 c 5.0 6
2 c 6 c 2 2
3 c c a c 2
4 c a 5.0 5.0 c
答案 3 :(得分:0)
(0,0)
看起来没有A
个密钥。这是可以理解的。根据你的图像,左上角是空的。只需在你的循环中添加一个关键指标的检查,你就可以了:
nrow = A.shape[0]-1
ncol = A.shape[1]-1
for i in range(0,nrow):
for j in range(0,ncol):
if (i,j) in A and "-" in A[i,j]:
A[i,j]= A[i,j].split(' - ')[1]