Python - 如果给出“ - ”,如何拆分单元格的内容

时间:2017-07-13 07:40:37

标签: python dataframe keyerror

我是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)。

问题: 有没有更优雅的方法来解决我的问题? 我的解决方案有什么问题?

edit: A.head()

4 个答案:

答案 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)

我认为你可以使用:

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]