Iterate a list of rows and split - python

I am trying to iterate through a list, then split the rows - to perform a function on specific element in the split.
what i want is something like this - so i can grab each element by postilion x[2] = 220
['2', '325', '220', '1.0']
what i get is this (split by character)
for row in range(len(pln)):
for j in range(len(pln[row])):
print( pln[row][j], end="")
x = [pln[row][j].split()]
print (x)
2[['2']]
[['', '']]
3[['3']]
2[['2']]
5[['5']]
[['', '']]
2[['2']]
2[['2']]
0[['0']]
[['', '']]
1[['1']]
.[['.']]
0[['0']]
[['\n']]
pln = (before iteration as list)
['2 325 220 1.0\n', '2 600 200 3.3\n', '2 325 100 3.3\n', '2 600 120 5.5\n', '2 600 125 5.5\n', '2 325 100 3.4']
pln = (after iteration)
2 325 220 1.0
2 600 200 3.3
2 325 100 3.3
2 600 120 5.5
2 600 125 5.5
2 325 100 3.4

Here is a solution:
lst = ['2 325 220 1.0\n', '2 600 200 3.3\n', '2 325 100 3.3\n', '2 600 120 5.5\n', '2 600 125 5.5\n', '2 325 100 3.4']
result_list = []
for i in lst:
k = i.split()
result_list.append(k)
print(result_list)
#Output:
[['2', '325', '220', '1.0'], ['2', '600', '200', '3.3'], ['2', '325', '100', '3.3'], ['2', '600', '120', '5.5'], ['2', '600', '125', '5.5'], ['2', '325', '100', '3.4']]
You can access an element like:
#result_list[row_number][element index]
print(result_list[2][3]) #fourth element in third row
#Output
3.3
You can iterate all rows like:
for row in result_list:
print(row)
#Output:
['2', '325', '220', '1.0']
['2', '600', '200', '3.3']
['2', '325', '100', '3.3']
['2', '600', '120', '5.5']
['2', '600', '125', '5.5']
['2', '325', '100', '3.4']
You can iterate any column like:
for row in result_list:
print(row[1]) #This will give second column
#Output:
325
600
325
600
600
325

Stop printing when doing your splitting. Print after the columns have been split.
pln = ['2 325 220 1.0\n', '2 600 200 3.3\n', '2 325 100 3.3\n', '2 600 120 5.5\n', '2 600 125 5.5\n', '2 325 100 3.4']
rows = [line.split() for line in pln]
for row in rows:
print('\t'.join(row))
You can then access each row by its index
second_row = rows[1]
Then access each column by index
third_column = second_row[2]

This code will store individual characters in new_listThis is all I understood from your question, if anything else do ask.
given_list = ['2','325','220','1.0']
new_list = list()
length = len(given_list)
for i in range(length):
for j in given_list[i]:
new_list.append(j)
if i+1 != length:
new_list.append(",")
print(new_list)
Output: ['2', ',', '3', '2', '5', ',', '2', '2', '0', ',', '1', '.', '0']

Related

Is there a way to do this in Python?

I have a data frame that looks like this:
data = {'State': ['24', '24', '24',
'24','24','24','24','24','24','24','24','24'],
'County code': ['001', '001', '001',
'001','002','002','002','002','003','003','003','003'],
'TT code': ['123', '123', '123',
'123','124','124','124','124','125','125','125','125'],
'BLK code': ['221', '221', '221',
'221','222','222','222','222','223','223','223','223'],
'Age Code': ['1', '1', '2', '2','2','2','2','2','2','1','2','1']}
df = pd.DataFrame(data)
essentially I want to just have where only the TT code where the age code is 2 and there are no 1's. So I just want to have the data frame where:
'State': ['24', '24', '24', '24'],
'County code': ['002','002','002','002',],
'TT code': ['124','124','124','124',],
'BLK code': ['222','222','222','222'],
'Age Code': ['2','2','2','2']
is there a way to do this?
IIUC, you want to keep only the TT groups where there are only Age groups with value '2'?
You can use a groupby.tranform('all') on the boolean Series:
df[df['Age Code'].eq('2').groupby(df['TT code']).transform('all')]
output:
State County code TT code BLK code Age Code
4 24 002 124 222 2
5 24 002 124 222 2
6 24 002 124 222 2
7 24 002 124 222 2
This should work.
df111['Age Code'] = "2"
I am just wondering why the choice of string for valueType of integer

How do i remove the quotes using my code?

Basically, can I know how to add quote_none to my code? I am using Python 3.7. I am trying to keep it as simple as possible.
csvFile = csv.reader(open("cats.csv",'r'))
header = next(csvFile)
index = 1
print (header)
print("")
for row in csvFile :
if row[1] >= "35" :
print (row)
index +=1
This is what I got:
1 ['Oliver', '12', 'HOPE']
2 ['Leo', '16', 'SPCA', '']
3 ['Milo', '13', 'ISPCA', ']
4 ['Jack', '12', 'SPCA', ']
5 ['George', '14', 'HOPE']
6 ['Bella', '10', 'FFF', ']
7 ['Cleo', '14', 'SPCA', '']
8 ['Nala', '16', 'ISPCA', '']
9 ['Teddy', '12', 'SPCA', ']
10 ['Zeus', '16', 'SPCA', '']
11 ['Louie', '14', 'LOVS', '']
12 ['Apollo', '11', 'FFF', '' ]
13 ['George', '10', 'SPCA', '']
14 ['Ziggy', '11', 'ISPCA', ']
Expected results:
1 ['Oliver,12,HOPE']
2 ['Leo,16,SPCA']
3 ['Charlie,18,SPCA']
4 ['Milo,13,ISPCA']
5 ['Jack,12,SPCA']
6 ['George,14']
7 ['Simon,22,SPCA']
8 ['Loki,24,SPCA']
9 ['Simba,23,SPCA']
Use join:
lst = ['Oliver', '12', 'HOPE']
print([','.join(lst)])
So, in your example I guess this would be:
print([','.join(row)])

Pandas - Resort Column Location

I have a pandas frame. When I print the columns (shown below), its turns out that my columns are out of order. Is there a way to sort only the first 30 columns so they are in order (30,60,90...900)?
[in] df.columns
[out] Index(['120', '150', '180', '210', '240', '270', '30', '300', '330', '360',
'390', '420', '450', '480', '510', '540', '570', '60', '600', '630',
'660', '690', '720', '750', '780', '810', '840', '870', '90', '900',
'Item', 'Price', 'Size', 'Time', 'Type', 'Unnamed: 0'],
dtype='object')
The fixed frame would be as follows:
[out] Index(['30','60','90,'120', '150', '180', '210', '240', '270','300', '330', '360',
'390', '420', '450', '480', '510', '540', '570','600', '630',
'660', '690', '720', '750', '780', '810', '840', '870','900',
'Item', 'Price', 'Size', 'Time', 'Type', 'Unnamed: 0'],
dtype='object')
If you know that the columns will be named 30 through 900 in multiples of 30, you can generate that explicitly like this:
c = [str(i) for i in range(30, 901, 30)]
Then add it to the other columns:
c = c + ['Item', 'Price', 'Size', 'Time', 'Type', 'Unnamed: 0']
Then you should be able to access it as df[c]
You need select first column names, convert to int and sort. Then convert back to str if necessary and use reindex_axis:
np.sort(df.columns[:30].astype(int)).astype(str).tolist() +
df.columns[30:].tolist()
Sample:
df = pd.DataFrame(np.arange(36).reshape(1,-1),
columns=['120', '150', '180', '210', '240', '270', '30', '300',
'330', '360','390', '420', '450', '480', '510', '540', '570', '60', '600', '630',
'660', '690', '720', '750', '780', '810', '840', '870', '90', '900',
'Item', 'Price', 'Size', 'Time', 'Type', 'Unnamed: 0'])
print (df)
120 150 180 210 240 270 30 300 330 360 ... 840 870 90 \
0 0 1 2 3 4 5 6 7 8 9 ... 26 27 28
900 Item Price Size Time Type Unnamed: 0
0 29 30 31 32 33 34 35
[1 rows x 36 columns]
df = df.reindex_axis(np.sort(df.columns[:30].astype(int)).astype(str).tolist() +
df.columns[30:].tolist(), axis=1)
print (df)
30 60 90 120 150 180 210 240 270 300 ... 810 840 870 \
0 6 17 28 0 1 2 3 4 5 7 ... 25 26 27
900 Item Price Size Time Type Unnamed: 0
0 29 30 31 32 33 34 35
[1 rows x 36 columns]

BeautifulSoup - Scraping Multiple Tables from a page?

I'm trying to scrape the content from this URL which contains multiple tables. The desired output would be:
NAME FG% FT% 3PM REB AST STL BLK TO PTS SCORE
Team Jackson (0-8) .4313 .7500 21 71 34 11 12 15 189 1-8-0
Team Keyrouze (4-4) .4441 .8090 31 130 71 18 13 45 373 8-1-0
Nutz Vs. Draymond Green (4-4) .4292 .8769 30 86 66 15 9 28 269 3-6-0
Team Pauls 2 da Wall (3-5) .4784 .8438 40 123 64 18 20 30 316 6-3-0
Team Noey (2-6) .4350 .7679 21 125 62 20 9 33 278 7-2-0
YOU REACH, I TEACH (2-5-1) .4810 .7432 20 114 56 30 7 50 277 2-7-0
Kris Kaman His Pants (5-3) .4328 .8000 20 74 59 20 5 27 238 3-6-0
Duke's Balls In Daniels Face (3-4-1) .5000 .7045 42 139 38 27 22 30 303 6-3-0
Knicks Tape (5-3) .5000 .8152 34 143 92 12 9 47 397 4-5-0
Suck MyDirk (5-3) .4734 .8814 29 106 86 22 17 40 435 5-4-0
In Porzingod We Trust (4-4) .4928 .7222 27 180 95 16 16 46 423 7-2-0
Team Aguilar (6-1-1) .4718 .7053 28 177 65 12 35 48 413 2-7-0
Team Li (7-0-1) .4714 .8118 35 134 74 17 17 47 368 6-3-0
Team Iannetta (4-4) .4527 .7302 22 125 90 20 13 44 288 3-6-0
If it's too difficult to format the tables like that, I'd like to know how I can scrape all the tables? My code to scrape all rows is like this:
tableStats = soup.find('table', {'class': 'tableBody'})
rows = tableStats.findAll('tr')
for row in rows:
print(row.string)
But it only prints the value "TEAM" and nothing else... Why doesn't it contain all the rows in the table?
Thanks.
Instead of looking for the table tag, you should look for the rows directly with a more dependable class, such as linescoreTeamRow. This code snippet does the trick,
from bs4 import BeautifulSoup
import requests
a = requests.get("http://games.espn.com/fba/scoreboard?leagueId=224165&seasonId=2017")
soup = BeautifulSoup(a.text, 'lxml')
# searching for the rows directly
rows = soup.findAll('tr', {'class': 'linescoreTeamRow'})
# you will need to isolate elements in the row for the table
for row in rows:
print row.text
Found a way to exactly get the 2-D matrix I specified in the question. It's stored as the list teams.
Code:
from bs4 import BeautifulSoup
import requests
source_code = requests.get("http://games.espn.com/fba/scoreboard?leagueId=224165&seasonId=2017")
plain_text = source_code.text
soup = BeautifulSoup(plain_text, 'lxml')
teams = []
rows = soup.findAll('tr', {'class': 'linescoreTeamRow'})
# Creates a 2-D matrix.
for row in range(len(rows)):
team_row = []
columns = rows[row].findAll('td')
for column in columns:
team_row.append(column.getText())
print(team_row)
# Add each team to a teams matrix.
teams.append(team_row)
Output:
['Team Jackson (0-10)', '', '.4510', '.8375', '41', '135', '101', '23', '11', '50', '384', '', '5-4-0']
['YOU REACH, I TEACH (3-6-1)', '', '.4684', '.7907', '22', '169', '103', '22', '10', '32', '342', '', '4-5-0']
['Nutz Vs. Draymond Green (4-6)', '', '.4552', '.8372', '30', '157', '68', '15', '16', '39', '356', '', '2-7-0']
["Jesse's Blue Balls (4-5-1)", '', '.4609', '.7576', '47', '158', '71', '30', '20', '38', '333', '', '7-2-0']
['Team Noey (4-6)', '', '.4763', '.8261', '42', '164', '70', '25', '29', '44', '480', '', '5-4-0']
['Suck MyDirk (6-3-1)', '', '.4733', '.8403', '54', '160', '132', '23', '11', '47', '544', '', '4-5-0']
['Kris Kaman His Pants (5-5)', '', '.4569', '.8732', '53', '138', '105', '27', '21', '53', '465', '', '6-3-0']
['Team Aguilar (6-3-1)', '', '.4433', '.7229', '40', '202', '68', '30', '22', '54', '452', '', '3-6-0']
['Knicks Tape (6-3-1)', '', '.4406', '.8824', '52', '172', '108', '24', '13', '49', '513', '', '6-3-0']
['Team Iannetta (4-6)', '', '.5321', '.6923', '24', '146', '94', '32', '16', '60', '428', '', '3-6-0']
['In Porzingod We Trust (6-4)', '', '.4694', '.6364', '37', '216', '133', '31', '21', '77', '468', '', '4-5-0']
['Team Keyrouze (6-4)', '', '.4705', '.8854', '51', '135', '108', '25', '17', '43', '550', '', '5-4-0']
['Team Li (8-1-1)', '', '.4369', '.8182', '57', '203', '130', '34', '22', '54', '525', '', '6-3-0']
['Team Pauls 2 da Wall (5-5)', '', '.4780', '.5970', '27', '141', '47', '19', '25', '28', '263', '', '3-6-0']

How do I convert data from a list of lists to a readable table (or group of columns)?

I have the following code that basically returns a list (player1Hand) of 5 lists (in this case, individual information about the cards in said hand).
def getPlayer2Hand(handAmount):
getPlayer2Deck()
player2Hand = []
for i in range(handAmount):
card = []
card.append(deckListPlayer2Full[i]['NameOfCard'])
card.append(deckListPlayer2Full[i]['Attack'])
card.append(deckListPlayer2Full[i]['Defense'])
card.append(deckListPlayer2Full[i]['Magic'])
card.append(deckListPlayer2Full[i]['Shield'])
player2Hand.append(card)
return player2Hand
How do I print out the info in the list "player2Hand" into readable columns or a table? I would like to use the dict keys above (NameOfCard, Attack, etc.) as headers.
I tried to use TextTable, but I can't seem to get it to work.
Here is an example of what player2Hand looks like:
[['Knight', '500', '500', '0', '0'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500']]
A bit string formatting might help:
>>> data = [['Knight', '500', '500', '0', '0'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500'],
['Mage', '0', '0', '500', '500']]
>>> frmt = '{:10s}' + 4 * '{:>12s}'
>>> for line in data::
print(frmt.format(*line))
results in:
Knight 500 500 0 0
Mage 0 0 500 500
Mage 0 0 500 500
Mage 0 0 500 500
Mage 0 0 500 500
Just a quick and dirty stab at what you may want to do:
>>> x = [['Knight', '500', '500', '0', '0'],['Mage', '0', '0', '500', '500'], ['Mage', '0', '0', '500', '500'], ['Mage', '0', '0', '500', '500'], ['Mage', '0', '0', '500', '500']]
>>> for row in x:
... output = [row[0].ljust(20)]
... for col in row[1:]:
... output.append(col.rjust(10))
... print ''.join(output)
...
Knight 500 500 0 0
Mage 0 0 500 500
Mage 0 0 500 500
Mage 0 0 500 500
Mage 0 0 500 500

Categories

Resources