gpt4 book ai didi

python-3.x - 选择 DataFrame 中的元素

转载 作者:行者123 更新时间:2023-12-01 00:28:51 24 4
gpt4 key购买 nike

我有一个数据框,没有包含信息字符串的列标题。我想根据每个单元格中的子字符串选择单元格中的部分值,并将这些元素包含在列表中。我发现列出答案的示例引用了数据框中的单个(命名)列,并且可以轻松应用 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]

编辑:

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

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']

关于python-3.x - 选择 DataFrame 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61073762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com