选择DataFrame中的元素



我有一个没有包含信息字符串的列标题的数据帧。我想根据每个单元格中的子字符串来选择单元格中的部分值,并将这些元素包含在列表中。我发现的列出答案的示例引用了数据帧中的单个(命名(列,并且可以很容易地应用loc/iloc来获取数据帧的str属性

数据帧如下所示:

0 A[3,5] A[6,7] C[3,9]
1 B[2,9] A[2,1] B[3,7]
2 B[5,6]   

从数据帧中,我想提取括号中包含的所有坐标,这些坐标在列表中列为A(作为字符串(。结果列表应为:

[3,5, 6,7, 2,1]

我从csv中读取了数据,并将其包含在数据帧中。我尝试了两种方法:首先,构建一个具有相同维度的数据帧,并在字母a所在的位置用1填充。

其次,我试图找到字符串"A"在数据帧中出现的位置,并一次性提取括号之间的部分。在这两种方法中,我都试图使用loc/iloc来引用数据帧的列,但得到一个AttributeError: 'DataFrame' object has no attribute 'str'。我的思考方式是否正确,或者是否有更有效的方式来解决我的问题?

更新:我已经能够将数据帧堆叠成一个系列,只剩下包含"a"的值。现在,我希望基于括号之间的子字符串来隔离坐标。下面代码的最后一行生成一个TypeError: 'Series' objects are mutable, thus they cannot be hashed。如何检索括号中的子字符串?

df = pd.read_csv("FILE.csv", header = None)
df = df.fillna('')
s = df.stack()
s = s[s.str.contains("A")]
s = s[s.str.find("["):s.str.rfind("]")]

错误表示没有一列,而是多列。因此,如果所有数据都在多列中,则在第一步中使用DataFrame.stack,然后通过Series.str.replace:处理数据

df = pd.read_csv("FILE.csv", header = None)
s = df.stack()
L = s[s.str.contains("A")].str.replace('[A[]]', '').tolist()
print (L)
['3,5', '6,7', '2,1']

最后,如果需要成对的整数,可以使用列表理解:

L1 = [[int(y) for y in x.split(',')] for x in L]
print (L1)
[[3, 5], [6, 7], [2, 1]]

或者@Vishnudev使用pd.eval的解决方案,什么比eval更安全:

L2 = s[s.str.contains("A")].str.replace('[A]', '').map(pd.eval).explode().tolist()
print (L2)
[3, 5, 6, 7, 2, 1]

Series.str.extractall的另一个想法:

L2 = s[s.str.contains("A")].str.extractall('(d+)')[0].astype(int).tolist()
print (L2)
[3, 5, 6, 7, 2, 1]

编辑:

在您的解决方案中,对于stack:可能删除的缺失值,有必要删除fillna

print (df)
0       1       2
0  A[3,5]  A[6,7]  C[3,9]
1  B[2,9]  A[2,1]  B[3,7]
2  B[5,6]     NaN     NaN
s = df.stack()
print (s)
0  0    A[3,5]
1    A[6,7]
2    C[3,9]
1  0    B[2,9]
1    A[2,1]
2    B[3,7]
2  0    B[5,6]
dtype: object
s = s[s.str.contains("A")]
print (s)
0  0    A[3,5]
1    A[6,7]
1  1    A[2,1]
dtype: object

[]之间的最后一个值最好使用Series.str.extract:

s = s.str.extract(r"[(.*?)]", expand=False)
print (s)
0  0    3,5
1    6,7
1  1    2,1
dtype: object

通过列表理解,您的解决方案是可能的:

a = [x[x.find("[")+1:x.rfind("]")] for x in s]
print (a)
['3,5', '6,7', '2,1']

最新更新