Pandas -带过滤器的列操作(字符串字符转换)

oo7oh9g9  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(114)

我在这里遇到了一个小挑战。我有以下 Dataframe :

ID               Cards  ...       opp cards1
0       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.000000     10
1       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.533690     10
2       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.021292     10
3       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.022805     10
4       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.999691     10
                    ...                 ...  ...       ...    ...
749995  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.162980     10
749996  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.541003     10
749997  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.341836     10
749998  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.219956     10
749999  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.363605     10

我想做的是下面的事情,我想从存储在列cards中的字符串中检索第一个字母,如果字符串第三个字符是字母,那么我想把它转换成整数,如果不是,那么保持原样。
例如,对于('ts', '2c', 'jd'),我们应该将t转换为10
我已经尝试了下面的代码。但是它似乎不起作用。我正在使用的过滤器似乎不适用于我正在存储新值的新列。

df = pd.read_csv('path', sep=";")

if (df['cards'].astype(str).str[0] =="t").any() == True:
    df['cards1'] = 10
else:
    df['cards1'] = df['cards'].astype(str).str[0]

下面返回的 Dataframe 。正如您在列cards1中看到的,值10总是被返回。

ID               Cards  ...       opp cards1
0       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.000000     10
1       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.533690     10
2       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.021292     10
3       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.022805     10
4       flop850262436159b10  ('3h', 'tc', '5s')  ...  0.999691     10
                    ...                 ...  ...       ...    ...
749995  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.162980     10
749996  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.541003     10
749997  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.341836     10
749998  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.219956     10
749999  flop573952955203b10  ('ts', '2c', 'jd')  ...  0.363605     10

老实说,我不知道如何改变这种情况。我非常乐意讨论其他的方法。
谢谢大家的帮助

jgovgodb

jgovgodb1#

嗨,我还不能发表评论,但我可能可以给你指出正确的方向。

df['cards'].astype(str).str[0]

将返回组合字符串中的第一个字符“(”。您可以尝试通过对象的索引到达对象的所需部分。

df['cards'][0][0]

将以字符串形式返回“3h”,并且可以通过其索引访问。

if (df['cards'][0][1][0] =="t") == True:

将返回True,因为我们在元组的第一个字符处访问元组的第二个元素。
(“3h”、“tc”、“5s”)

hgc7kmma

hgc7kmma2#

如果使用 “string 3rd character” 表示字符元组中字符的序号位置,请使用以下方法:

cards_3rdc = df.Cards.apply(lambda x: x[1][0])
df['cards1'] = pd.to_numeric(np.where(cards_3rdc == 't', 10, cards_3rdc))

df的输出示例:

ID         Cards  ...       opp  cards1
idx                                                             
0       flop850262436159b10  (3h, tc, 5s)  ...  0.000000      10
1       flop850262436159b10  (3h, tc, 5s)  ...  0.533690      10
2       flop850262436159b10  (3h, tc, 5s)  ...  0.021292      10
3       flop850262436159b10  (3h, tc, 5s)  ...  0.022805      10
4       flop850262436159b10  (3h, tc, 5s)  ...  0.999691      10
749995  flop573952955203b10  (ts, 2c, jd)  ...  0.162980       2
749996  flop573952955203b10  (ts, 2c, jd)  ...  0.541003       2
749997  flop573952955203b10  (ts, 2c, jd)  ...  0.341836       2
749998  flop573952955203b10  (ts, 2c, jd)  ...  0.219956       2
749999  flop573952955203b10  (ts, 2c, jd)  ...  0.363605       2
vdzxcuhz

vdzxcuhz3#

首先确保列Cards的类型为str。
然后我们可以取字符[8]并检查它是否在0 - 9中。
如果此条件== True,则将"cards10"写入cards1列。
这可能看起来像这样:

df["Cards"]=df["Cards"].astype(str)

df["result"][df["test"].str[8].isin(values=["0","1","2","3","4","5","6","7","8","9"])]="cards11"
#output
0   ('3h', 'tc', '5s')  
1   ('ts', '2c', 'jd')  cards11
2   ('3h', 'tc', '5s')

如果你想在卡片栏里替换它

df["Cards"].replace("t","10",regex=True, inplace=True)
#output
#0  ('3h', '10c', '5s') 
#1  ('10s', '2c', 'jd') 
#2  ('3h', '10c', '5s')

相关问题