[英]Pandas Dataframe: How to parse integers into string of 0s and 1s?
我有以下pandas DataFrame。
import pandas as pd
df = pd.read_csv('filename.csv')
print(df)
sample column_A
0 sample1 6/6
1 sample2 0/4
2 sample3 2/6
3 sample4 12/14
4 sample5 15/21
5 sample6 12/12
.. ....
column_A
中的值不是分數,必須操縱這些數據,以便我可以將每個值轉換為0s
和1s
(不將整數轉換為它們的二進制對應)。
的“分子”上面給出的總數1s
,而“分母”給出的總數0s
和1s
到一起。
因此,該表實際上應采用以下格式:
sample column_A
0 sample1 111111
1 sample2 0000
2 sample3 110000
3 sample4 11111111111100
4 sample5 111111111111111000000
5 sample6 111111111111
.. ....
我從來沒有解析過整數來輸出像這樣的0和1的字符串。 怎么做到這一點? 是否有一個“pandas方法”與lambda
表達式一起使用? Pythonic字符串解析還是正則表達式?
首先,假設你寫了一個函數:
def to_binary(s):
n_d = s.split('/')
n, d = int(n_d[0]), int(n_d[1])
return '1' * n + '0' * (d - n)
以便,
>>> to_binary('4/5')
'11110'
現在你只需要使用pandas.Series.apply
:
df.column_A.apply(to_binary)
替代:
df2 = df['column_A'].str.split('/', expand=True).astype(int)\
.assign(ones='1').assign(zeros='0')
df2
Out:
0 1 ones zeros
0 6 6 1 0
1 0 4 1 0
2 2 6 1 0
3 12 14 1 0
4 15 21 1 0
5 12 12 1 0
(df2[0] * df2['ones']).str.cat((df2[1]-df2[0])*df2['zeros'])
Out:
0 111111
1 0000
2 110000
3 11111111111100
4 111111111111111000000
5 111111111111
dtype: object
注意:我實際上試圖找到一個更快的替代思維應用會很慢,但這個結果會變慢。
以下是使用extract()和.str.repeat()方法的一些替代解決方案:
In [187]: x = df.column_A.str.extract(r'(?P<ones>\d+)/(?P<len>\d+)', expand=True).astype(int).assign(o='1', z='0')
In [188]: x
Out[188]:
ones len o z
0 6 6 1 0
1 0 4 1 0
2 2 6 1 0
3 12 14 1 0
4 15 21 1 0
5 12 12 1 0
In [189]: x.o.str.repeat(x.ones) + x.z.str.repeat(x.len-x.ones)
Out[189]:
0 111111
1 0000
2 110000
3 11111111111100
4 111111111111111000000
5 111111111111
dtype: object
或緩慢(兩個apply()
)單行:
In [190]: %paste
(df.column_A.str.extract(r'(?P<one>\d+)/(?P<len>\d+)', expand=True)
.astype(int)
.apply(lambda x: ['1'] * x.one + ['0'] * (x.len-x.one), axis=1)
.apply(''.join)
)
## -- End pasted text --
Out[190]:
0 111111
1 0000
2 110000
3 11111111111100
4 111111111111111000000
5 111111111111
dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.